diff --git a/.gitignore b/.gitignore
index 0cd6d8a17..f12bf8782 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,6 @@
# Exclude the build directory
build/*
+examples/FilterShowcase/build*
# Exclude temp nibs and swap files
*~.nib
@@ -7,6 +8,7 @@ build/*
# Exclude OS X folder attributes
.DS_Store
+.svn
# Exclude user-specific XCode 3 and 4 files
*.mode1
@@ -16,4 +18,8 @@ build/*
*.perspectivev3
*.pbxuser
*.xcworkspace
-xcuserdata
\ No newline at end of file
+xcuserdata
+
+# Documentation
+documentation/*
+
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 000000000..eb328e5c4
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,26 @@
+
+language: objective-c
+
+before_install:
+ - pod --version
+ - pod setup --silent
+ - 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 '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'
+ - 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
diff --git a/GPUImage.podspec b/GPUImage.podspec
new file mode 100644
index 000000000..4e1961cbf
--- /dev/null
+++ b/GPUImage.podspec
@@ -0,0 +1,27 @@
+Pod::Spec.new do |s|
+ s.name = 'GPUImage'
+ s.version = '0.1.7'
+ s.license = 'BSD'
+ 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.requires_arc = true
+ s.xcconfig = { 'CLANG_MODULES_AUTOLINK' => 'YES' }
+
+ 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',
+ 'framework/Source/GPUImageFilterPipeline.*',
+ 'framework/Source/GPUImageMovieComposition.*',
+ 'framework/Source/GPUImageVideoCamera.*',
+ 'framework/Source/GPUImageStillCamera.*',
+ 'framework/Source/GPUImageUIElement.*'
+ s.osx.xcconfig = { 'GCC_WARN_ABOUT_RETURN_TYPE' => 'YES' }
+end
diff --git a/License.txt b/License.txt
old mode 100644
new mode 100755
index 881d5f263..e8062d915
--- 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..16bc3f64f 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,14 @@
-# GPUImage framework #
+# GPUImage #
+
+

+
+
Brad Larson
http://www.sunsetlakesoftware.com
-[@bradlarson](http://twitter.com/bradlarson)
+[@bradlarson](https://twitter.com/bradlarson)
contact@sunsetlakesoftware.com
@@ -20,7 +24,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 ##
@@ -29,7 +33,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 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.
@@ -38,7 +42,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.
@@ -46,8 +50,219 @@ For example, an application that takes in live video from the camera, converts t
GPUImageVideoCamera -> GPUImageSepiaFilter -> GPUImageView
+## 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:
+
+- 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 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`).
+
+## 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.
+
+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.
+
+## 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 *dataForJPEGFile = UIImageJPEGRepresentation(processedImage, 0.8);
+
+ NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
+ NSString *documentsDirectory = [paths objectAtIndex:0];
+
+ NSError *error2 = nil;
+ if (![dataForJPEGFile 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:
+
### Color adjustments ###
- **GPUImageBrightnessFilter**: Adjusts the brightness of the image
@@ -65,257 +280,440 @@ For example, an application that takes in live video from the camera, converts t
- **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
+- **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
+
+- **GPUImageVibranceFilter**: Adjusts the vibrance of an image
+ - *vibrance*: The vibrance adjustment to apply, using 0.0 as the default, and a suggested min/max of around -1.2 and 1.2, respectively.
+
+- **GPUImageWhiteBalanceFilter**: Adjusts the white balance of an image.
+ - *temperature*: The temperature to adjust the image by, in ºK. A value of 4000 is very cool and 7000 very warm. The default value is 5000. Note that the scale between 4000 and 5000 is nearly as visually significant as that between 5000 and 7000.
+ - *tint*: The tint to adjust the image by. A value of -200 is *very* green and 200 is *very* pink. The default value is 0.
+
+- **GPUImageToneCurveFilter**: Adjusts the colors of an image based on spline curves for each color channel.
+ - *redControlPoints*:
+ - *greenControlPoints*:
+ - *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.
+ - *highlights*: Decrease to darken highlights, from 1.0 to 0.0, with 1.0 as the default.
+
+- **GPUImageHighlightShadowTintFilter**: Allows you to tint the shadows and highlights of an image independently using a color and intensity
+ - *shadowTintColor*: Shadow tint RGB color (GPUVector4). Default: `{1.0f, 0.0f, 0.0f, 1.0f}` (red).
+ - *highlightTintColor*: Highlight tint RGB color (GPUVector4). Default: `{0.0f, 0.0f, 1.0f, 1.0f}` (blue).
+ - *shadowTintIntensity*: Shadow tint intensity, from 0.0 to 1.0. Default: 0.0
+ - *highlightTintIntensity*: Highlight tint intensity, from 0.0 to 1.0, with 0.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.
+
+- **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.
+
+- **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.
+
+- **GPUImageSkinToneFilter**: A skin-tone adjustment filter that affects a unique range of light skin-tone colors and adjusts the pink/green or pink/orange range accordingly. Default values are targetted at fair caucasian skin, but can be adjusted as required.
+ - *skinToneAdjust*: Amount to adjust skin tone. Default: 0.0, suggested min/max: -0.3 and 0.3 respectively.
+ - *skinHue*: Skin hue to be detected. Default: 0.05 (fair caucasian to reddish skin).
+ - *skinHueThreshold*: Amount of variance in skin hue. Default: 40.0.
+ - *maxHueShift*: Maximum amount of hue shifting allowed. Default: 0.25.
+ - *maxSaturationShift* = Maximum amount of saturation to be shifted (when using orange). Default: 0.4.
+ - *upperSkinToneColor* = `GPUImageSkinToneUpperColorGreen` or `GPUImageSkinToneUpperColorOrange`
+
- **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)
+- **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.
+
+- **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*:
+
+- **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)
+- **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.
+ - *blurRadiusInPixels*: A multiplier for the background averaging blur radius in pixels, with a default of 4.
-### Image processing ###
+- **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.
-- **GPUImageRotationFilter**: This lets you rotate an image left or right by 90 degrees, or flip it horizontally or vertically
+- **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
- *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.
+- **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)
- **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 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
+- **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.
+
+- **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
+ - *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
+ - *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.
-- **GPUImageBoxBlurFilter**: A hardware-accelerated 9-hit box blur of an image
+- **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
-### Blending modes ###
+- **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.
-- **GPUImageChromaKeyBlendFilter**: Selectively replaces a color in the first image with the second image
- - *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)
+- **GPUImageMedianFilter**: Takes the median value of the three color components, over a 3x3 area
-- **GPUImageDissolveBlendFilter**: Applies a dissolve blend of two images
- - *mix*: The degree with which the second image overrides the first (0.0 - 1.0, with 0.5 as the default)
+- **GPUImageBilateralFilter**: A bilateral blur, which tries to blur similar color values while preserving sharp edges
+ - *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.
-- **GPUImageMultiplyBlendFilter**: Applies a multiply blend of two images
+- **GPUImageTiltShiftFilter**: A simulated tilt shift lens effect
+ - *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
-- **GPUImageOverlayBlendFilter**: Applies an overlay blend of two images
+- **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.
-- **GPUImageDarkenBlendFilter**: Blends two images by taking the minimum value of each color component between the images
+- **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.
-- **GPUImageLightenBlendFilter**: Blends two images by taking the maximum value of each color component between the images
+- **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.
-- **GPUImageColorBurnBlendFilter**: Applies a color burn blend of two images
+- **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
-- **GPUImageColorDodgeBlendFilter**: Applies a color dodge blend of two images
+- **GPUImageCannyEdgeDetectionFilter**: This uses the full Canny process to highlight one-pixel-wide edges
+ - *texelWidth*:
+ - *texelHeight*: These parameters affect the visibility of the detected edges
+ - *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.
-- **GPUImageScreenBlendFilter**: Applies a screen blend of two images
+- **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.
+ - *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.
-- **GPUImageExclusionBlendFilter**: Applies an exclusion blend of two images
+- **GPUImageNobleCornerDetectionFilter**: Runs the Noble variant on the Harris corner detector. It behaves as described above for the Harris detector.
+ - *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.
-- **GPUImageDifferenceBlendFilter**: Applies a difference blend of two images
+- **GPUImageShiTomasiCornerDetectionFilter**: Runs the Shi-Tomasi feature detector. It behaves as described above for the Harris detector.
+ - *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.
-- **GPUImageHardLightBlendFilter**: Applies a hard light blend of two images
+- **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.
-- **GPUImageSoftLightBlendFilter**: Applies a soft light blend of two images
+- **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.
-### Visual effects ###
+- **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.
-- **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)
+- **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.
-- **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
+- **GPUImageRGBDilationFilter**: This is the same as the GPUImageDilationFilter, except that this acts on all color channels, not just the red channel.
-- **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
+- **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.
-- **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
+- **GPUImageRGBErosionFilter**: This is the same as the GPUImageErosionFilter, except that this acts on all color channels, not just the red channel.
-- **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.
+- **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.
-- **GPUImageSwirlFilter**: Creates a swirl distortion on the image
- - *radius*: The radius from the center to apply the distortion, with a default of 0.5
- - *center*: The center of the image (in normalized coordinates from 0 - 1.0) about which to twist, with a default of (0.5, 0.5)
- - *angle*: The amount of twist to apply to the image, with a default of 1.0
+- **GPUImageRGBOpeningFilter**: This is the same as the GPUImageOpeningFilter, except that this acts on all color channels, not just the red channel.
-- **GPUImageBulgeDistortionFilter**: Creates a bulge distortion on the image
- - *radius*: The radius from the center to apply the distortion, with a default of 0.25
- - *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 -1.0 to 1.0, with a default of 0.5
+- **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.
-- **GPUImagePinchDistortionFilter**: Creates a pinch distortion of the image
- - *radius*: The radius from the center to apply the distortion, with a default of 1.0
- - *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
+- **GPUImageRGBClosingFilter**: This is the same as the GPUImageClosingFilter, except that this acts on all color channels, not just the red channel.
-- **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
+- **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.
-- **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.
+- **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.
-You can also easily write your own custom filters using the C-like OpenGL Shading Language, as described below.
+- **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.
-## Adding the framework to your iOS project ##
+- **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.
-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.
+- **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.
-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:
+- **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.
-- CoreMedia
-- CoreVideo
-- OpenGLES
-- AVFoundation
-- QuartzCore
+- **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
-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.
+### Blending modes ###
-To use the GPUImage classes within your application, simply include the core framework header using the following:
+- **GPUImageChromaKeyBlendFilter**: Selectively replaces a color in the first image with the second image
+ - *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)
- #import "GPUImage.h"
+- **GPUImageDissolveBlendFilter**: Applies a dissolve blend of two images
+ - *mix*: The degree with which the second image overrides the first (0.0 - 1.0, with 0.5 as the default)
-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.
+- **GPUImageMultiplyBlendFilter**: Applies a multiply blend of two images
-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.
+- **GPUImageAddBlendFilter**: Applies an additive blend of two images
-## Performing common tasks ##
+- **GPUImageSubtractBlendFilter**: Applies a subtractive blend of two images
-### Filtering live video ###
+- **GPUImageDivideBlendFilter**: Applies a division blend of two images
-To filter live video from an iOS device's camera, you can use code like the following:
+- **GPUImageOverlayBlendFilter**: Applies an overlay blend of two images
- GPUImageVideoCamera *videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack];
- GPUImageFilter *customFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"CustomShader"];
- GPUImageView *filteredVideoView = [[GPUImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, viewWidth, viewHeight)];
+- **GPUImageDarkenBlendFilter**: Blends two images by taking the minimum value of each color component between the images
- // Add the view somewhere so it's visible
+- **GPUImageLightenBlendFilter**: Blends two images by taking the maximum value of each color component between the images
- [videoCamera addTarget:thresholdFilter];
- [customFilter addTarget:filteredVideoView];
+- **GPUImageColorBurnBlendFilter**: Applies a color burn blend of two images
- [videoCamera startCameraCapture];
+- **GPUImageColorDodgeBlendFilter**: Applies a color dodge blend of two images
-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.
+- **GPUImageScreenBlendFilter**: Applies a screen blend of two images
-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.
+- **GPUImageExclusionBlendFilter**: Applies an exclusion blend of two images
-### Processing a still image ###
+- **GPUImageDifferenceBlendFilter**: Applies a difference blend of two images
-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:
+- **GPUImageHardLightBlendFilter**: Applies a hard light blend of two images
- UIImage *inputImage = [UIImage imageNamed:@"Lambeau.jpg"];
+- **GPUImageSoftLightBlendFilter**: Applies a soft light blend of two images
- GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage];
- GPUImageSepiaFilter *stillImageFilter = [[GPUImageSepiaFilter alloc] init];
+- **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)
- [stillImageSource addTarget:stillImageFilter];
- [stillImageSource processImage];
+- **GPUImageSourceOverBlendFilter**: Applies a source over blend of two images
- UIImage *currentFilteredVideoFrame = [stillImageFilter imageFromCurrentlyProcessedOutput];
+- **GPUImageColorBurnBlendFilter**: Applies a color burn blend of two images
-For single filters that you wish to apply to an image, you can simply do the following:
+- **GPUImageColorDodgeBlendFilter**: Applies a color dodge blend of two images
- GPUImageSepiaFilter *stillImageFilter2 = [[GPUImageSepiaFilter alloc] init];
- UIImage *quickFilteredImage = [stillImageFilter2 imageByFilteringImage:inputImage];
+- **GPUImageNormalBlendFilter**: Applies a normal blend of two images
-### Writing a custom filter ###
+- **GPUImageColorBlendFilter**: Applies a color blend of two images
-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.
+- **GPUImageHueBlendFilter**: Applies a hue blend of two images
-A custom filter is initialized with code like
+- **GPUImageSaturationBlendFilter**: Applies a saturation blend of two images
- GPUImageFilter *customFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"CustomShader"];
+- **GPUImageLuminosityBlendFilter**: Applies a luminosity blend of two images
-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.
+- **GPUImageLinearBurnBlendFilter**: Applies a linear burn blend of two images
-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:
+- **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.
- varying highp vec2 textureCoordinate;
+- **GPUImageMaskFilter**: Masks one image using another
- uniform sampler2D inputImageTexture;
+### Visual effects ###
- 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);
-
- gl_FragColor = outputColor;
- }
+- **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)
-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.
+- **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)
-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.
+- **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.
-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.
+- **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.
-### Filtering and re-encoding a movie ###
+- **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.
-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.
+- **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
-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:
+- **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
+ - *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
- movieFile = [[GPUImageMovie alloc] initWithURL:sampleURL];
- pixellateFilter = [[GPUImagePixellateFilter alloc] init];
- GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight];
+- **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
+ - *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
- [movieFile addTarget:rotationFilter];
- [rotationFilter addTarget:pixellateFilter];
+- **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
- NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"];
- unlink([pathToMovie UTF8String]);
- NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie];
+- **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.
- movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480.0, 640.0)];
- [pixellateFilter addTarget:movieWriter];
+- **GPUImageSwirlFilter**: Creates a swirl distortion on the image
+ - *radius*: The radius from the center to apply the distortion, with a default of 0.5
+ - *center*: The center of the image (in normalized coordinates from 0 - 1.0) about which to twist, with a default of (0.5, 0.5)
+ - *angle*: The amount of twist to apply to the image, with a default of 1.0
- [movieWriter startRecording];
- [movieFile startProcessing];
+- **GPUImageBulgeDistortionFilter**: Creates a bulge distortion on the image
+ - *radius*: The radius from the center to apply the distortion, with a default of 0.25
+ - *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 -1.0 to 1.0, with a default of 0.5
-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:
+- **GPUImagePinchDistortionFilter**: Creates a pinch distortion of the image
+ - *radius*: The radius from the center to apply the distortion, with a default of 1.0
+ - *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
- [pixellateFilter removeTarget:movieWriter];
- [movieWriter finishRecording];
+- **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)
-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.
+- **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
+ - *vignetteCenter*: The center for the vignette in tex coords (CGPoint), with a default of 0.5, 0.5
+ - *vignetteColor*: The color to use for the vignette (GPUVector3), with a default of black
+ - *vignetteStart*: The normalized distance from the center where the vignette effect starts, with a default of 0.5
+ - *vignetteEnd*: The normalized distance from the center where the vignette effect ends, with a default of 0.75
+
+- **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 above.
## Sample applications ##
@@ -329,6 +727,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.
@@ -341,16 +743,14 @@ 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.
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.
diff --git a/build.sh b/build.sh
new file mode 100755
index 000000000..399c72e2e
--- /dev/null
+++ b/build.sh
@@ -0,0 +1,31 @@
+#!/bin/bash
+
+set -e
+
+IOSSDK_VER="9.0"
+
+# 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
+
+# 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
diff --git a/examples/CubeExample/Classes/CubeExampleAppDelegate.h b/examples/CubeExample/Classes/CubeExampleAppDelegate.h
deleted file mode 100644
index 586aa869c..000000000
--- a/examples/CubeExample/Classes/CubeExampleAppDelegate.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#import
-
-@class EAGLView;
-
-@interface CubeExampleAppDelegate : NSObject {
- UIWindow *window;
- EAGLView *glView;
-}
-
-@property (nonatomic, retain) IBOutlet UIWindow *window;
-@property (nonatomic, retain) IBOutlet EAGLView *glView;
-
-@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/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
-
-
-
-
-
- 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/FilterShowcase/FilterShowcase/CustomFilter.fsh b/examples/FilterShowcase/FilterShowcase/CustomFilter.fsh
deleted file mode 100644
index cd1b06a17..000000000
--- a/examples/FilterShowcase/FilterShowcase/CustomFilter.fsh
+++ /dev/null
@@ -1,14 +0,0 @@
-varying highp vec2 textureCoordinate;
-uniform sampler2D inputImageTexture;
-
-precision highp float;
-
-void main (void)
-{
- highp vec2 sampleDivisor = vec2(fractionalWidthOfPixel);
-
- highp vec2 samplePos = textureCoordinate - mod(textureCoordinate, sampleDivisor);
- gl_FragColor = texture2D(inputImageTexture, samplePos );
-}
-
-
diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m b/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m
deleted file mode 100644
index 8a5e0ac18..000000000
--- a/examples/FilterShowcase/FilterShowcase/ShowcaseAppDelegate.m
+++ /dev/null
@@ -1,52 +0,0 @@
-#import "ShowcaseAppDelegate.h"
-#import "ShowcaseFilterListController.h"
-
-@implementation ShowcaseAppDelegate
-
-@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];
-
- filterNavigationController = [[UINavigationController alloc] init];
- [self.window addSubview:filterNavigationController.view];
-
- filterListController = [[ShowcaseFilterListController alloc] initWithNibName:nil bundle:nil];
-
- [filterNavigationController pushViewController:filterListController animated:NO];
-
- [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/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h
deleted file mode 100644
index 0899c8a3d..000000000
--- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.h
+++ /dev/null
@@ -1,79 +0,0 @@
-#import
-#import "GPUImage.h"
-
-typedef enum {
- GPUIMAGE_SATURATION,
- GPUIMAGE_CONTRAST,
- GPUIMAGE_BRIGHTNESS,
- GPUIMAGE_EXPOSURE,
- GPUIMAGE_SHARPEN,
- GPUIMAGE_UNSHARPMASK,
- GPUIMAGE_TRANSFORM,
- GPUIMAGE_TRANSFORM3D,
- GPUIMAGE_CROP,
- GPUIMAGE_GAMMA,
- GPUIMAGE_HAZE,
- GPUIMAGE_SEPIA,
- GPUIMAGE_COLORINVERT,
- GPUIMAGE_GRAYSCALE,
- GPUIMAGE_THRESHOLD,
- GPUIMAGE_ADAPTIVETHRESHOLD,
- GPUIMAGE_PIXELLATE,
- GPUIMAGE_POLARPIXELLATE,
- GPUIMAGE_CROSSHATCH,
- GPUIMAGE_SOBELEDGEDETECTION,
- GPUIMAGE_SKETCH,
- GPUIMAGE_TOON,
- GPUIMAGE_CGA,
- GPUIMAGE_POSTERIZE,
- GPUIMAGE_KUWAHARA,
- GPUIMAGE_VIGNETTE,
- GPUIMAGE_GAUSSIAN,
- GPUIMAGE_GAUSSIAN_SELECTIVE,
- GPUIMAGE_FASTBLUR,
- GPUIMAGE_BOXBLUR,
- GPUIMAGE_SWIRL,
- GPUIMAGE_BULGE,
- GPUIMAGE_PINCH,
- GPUIMAGE_STRETCH,
- GPUIMAGE_DISSOLVE,
- GPUIMAGE_CHROMAKEY,
- 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_FILTERGROUP,
- GPUIMAGE_NUMFILTERS
-} GPUImageShowcaseFilterType;
-
-@interface ShowcaseFilterViewController : UIViewController
-{
- GPUImageVideoCamera *videoCamera;
- GPUImageOutput *filter;
- GPUImagePicture *sourcePicture;
- GPUImageShowcaseFilterType filterType;
-
- GPUImageFilterPipeline *pipeline;
-
- __unsafe_unretained UISlider *_filterSettingsSlider;
-}
-
-@property(readwrite, unsafe_unretained, nonatomic) IBOutlet UISlider *filterSettingsSlider;
-
-// Initialization and teardown
-- (id)initWithFilterType:(GPUImageShowcaseFilterType)newFilterType;
-- (void)setupFilter;
-
-// Filter adjustments
-- (IBAction)updateFilterFromSlider:(id)sender;
-
-@end
diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m
deleted file mode 100644
index fd8f094c6..000000000
--- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m
+++ /dev/null
@@ -1,620 +0,0 @@
-#import "ShowcaseFilterViewController.h"
-
-@implementation ShowcaseFilterViewController
-
-#pragma mark -
-#pragma mark Initialization and teardown
-
-- (id)initWithFilterType:(GPUImageShowcaseFilterType)newFilterType;
-{
- self = [super initWithNibName:@"ShowcaseFilterViewController" bundle:nil];
- if (self)
- {
- filterType = newFilterType;
- }
- return self;
-}
-
-- (void)didReceiveMemoryWarning
-{
- [super didReceiveMemoryWarning];
-}
-
-#pragma mark - View lifecycle
-
-- (void)viewDidLoad
-{
- [super viewDidLoad];
-
- [self setupFilter];
-}
-
-- (void)viewWillDisappear:(BOOL)animated
-{
- // Note: I needed to stop camera capture before the view went off the screen in order to prevent a crash from the camera still sending frames
- [videoCamera stopCameraCapture];
-
- [super viewWillDisappear:animated];
-}
-
-- (void)viewDidUnload
-{
- [super viewDidUnload];
-
-}
-
-- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
-{
- return (interfaceOrientation == UIInterfaceOrientationPortrait);
-}
-
-- (void)setupFilter;
-{
- videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack];
- GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight];
-
- switch (filterType)
- {
- case GPUIMAGE_SEPIA:
- {
- self.title = @"Sepia Tone";
- self.filterSettingsSlider.hidden = NO;
-
- [self.filterSettingsSlider setValue:1.0];
- [self.filterSettingsSlider setMinimumValue:0.0];
- [self.filterSettingsSlider setMaximumValue:1.0];
-
- filter = [[GPUImageSepiaFilter alloc] init];
- }; break;
- case GPUIMAGE_PIXELLATE:
- {
- self.title = @"Pixellate";
- self.filterSettingsSlider.hidden = NO;
-
- [self.filterSettingsSlider setValue:0.05];
- [self.filterSettingsSlider setMinimumValue:0.0];
- [self.filterSettingsSlider setMaximumValue:0.3];
-
- filter = [[GPUImagePixellateFilter alloc] init];
- }; break;
- case GPUIMAGE_POLARPIXELLATE:
- {
- self.title = @"Polar Pixellate";
- self.filterSettingsSlider.hidden = NO;
-
- [self.filterSettingsSlider setValue:0.05];
- [self.filterSettingsSlider setMinimumValue:-0.1];
- [self.filterSettingsSlider setMaximumValue:0.1];
-
- filter = [[GPUImagePolarPixellateFilter alloc] init];
- }; break;
- case GPUIMAGE_CROSSHATCH:
- {
- self.title = @"Crosshatch";
- self.filterSettingsSlider.hidden = YES;
-
- filter = [[GPUImageCrosshatchFilter alloc] init];
- }; break;
- case GPUIMAGE_COLORINVERT:
- {
- self.title = @"Color Invert";
- self.filterSettingsSlider.hidden = YES;
-
- filter = [[GPUImageColorInvertFilter alloc] init];
- }; break;
- case GPUIMAGE_GRAYSCALE:
- {
- self.title = @"Grayscale";
- self.filterSettingsSlider.hidden = YES;
-
- filter = [[GPUImageGrayscaleFilter alloc] init];
- }; break;
- case GPUIMAGE_SATURATION:
- {
- self.title = @"Saturation";
- self.filterSettingsSlider.hidden = NO;
-
- [self.filterSettingsSlider setValue:1.0];
- [self.filterSettingsSlider setMinimumValue:0.0];
- [self.filterSettingsSlider setMaximumValue:2.0];
-
- filter = [[GPUImageSaturationFilter alloc] init];
- }; break;
- case GPUIMAGE_CONTRAST:
- {
- self.title = @"Contrast";
- self.filterSettingsSlider.hidden = NO;
-
- [self.filterSettingsSlider setMinimumValue:0.0];
- [self.filterSettingsSlider setMaximumValue:4.0];
- [self.filterSettingsSlider setValue:1.0];
-
- filter = [[GPUImageContrastFilter alloc] init];
- }; break;
- case GPUIMAGE_BRIGHTNESS:
- {
- self.title = @"Brightness";
- self.filterSettingsSlider.hidden = NO;
-
- [self.filterSettingsSlider setMinimumValue:-1.0];
- [self.filterSettingsSlider setMaximumValue:1.0];
- [self.filterSettingsSlider setValue:0.0];
-
- filter = [[GPUImageBrightnessFilter alloc] init];
- }; break;
- case GPUIMAGE_EXPOSURE:
- {
- self.title = @"Exposure";
- self.filterSettingsSlider.hidden = NO;
-
- [self.filterSettingsSlider setMinimumValue:-4.0];
- [self.filterSettingsSlider setMaximumValue:4.0];
- [self.filterSettingsSlider setValue:0.0];
-
- filter = [[GPUImageExposureFilter alloc] init];
- }; break;
- case GPUIMAGE_SHARPEN:
- {
- self.title = @"Sharpen";
- self.filterSettingsSlider.hidden = NO;
-
- [self.filterSettingsSlider setMinimumValue:-1.0];
- [self.filterSettingsSlider setMaximumValue:4.0];
- [self.filterSettingsSlider setValue:0.0];
-
- filter = [[GPUImageSharpenFilter alloc] init];
- }; break;
- case GPUIMAGE_UNSHARPMASK:
- {
- self.title = @"Unsharp Mask";
- self.filterSettingsSlider.hidden = NO;
-
- [self.filterSettingsSlider setMinimumValue:0.0];
- [self.filterSettingsSlider setMaximumValue:5.0];
- [self.filterSettingsSlider setValue:1.0];
-
- filter = [[GPUImageUnsharpMaskFilter alloc] init];
-
-// [(GPUImageUnsharpMaskFilter *)filter setIntensity:3.0];
- }; break;
- case GPUIMAGE_GAMMA:
- {
- self.title = @"Gamma";
- self.filterSettingsSlider.hidden = NO;
-
- [self.filterSettingsSlider setMinimumValue:0.0];
- [self.filterSettingsSlider setMaximumValue:3.0];
- [self.filterSettingsSlider setValue:1.0];
-
- filter = [[GPUImageGammaFilter alloc] init];
- }; break;
- case GPUIMAGE_HAZE:
- {
- self.title = @"Haze / UV";
- self.filterSettingsSlider.hidden = NO;
-
- [self.filterSettingsSlider setMinimumValue:-0.2];
- [self.filterSettingsSlider setMaximumValue:0.2];
- [self.filterSettingsSlider setValue:0.2];
-
- filter = [[GPUImageHazeFilter alloc] init];
- }; break;
- case GPUIMAGE_THRESHOLD:
- {
- self.title = @"Luminance Threshold";
- self.filterSettingsSlider.hidden = NO;
-
- [self.filterSettingsSlider setMinimumValue:0.0];
- [self.filterSettingsSlider setMaximumValue:1.0];
- [self.filterSettingsSlider setValue:0.5];
-
- filter = [[GPUImageLuminanceThresholdFilter alloc] init];
- }; break;
- case GPUIMAGE_ADAPTIVETHRESHOLD:
- {
- self.title = @"Adaptive Threshold";
- self.filterSettingsSlider.hidden = YES;
-
- filter = [[GPUImageAdaptiveThresholdFilter alloc] init];
- }; break;
- case GPUIMAGE_CROP:
- {
- self.title = @"Crop";
- self.filterSettingsSlider.hidden = NO;
-
- [self.filterSettingsSlider setMinimumValue:0.3];
- [self.filterSettingsSlider setMaximumValue:1.0];
- [self.filterSettingsSlider setValue:0.5];
-
- filter = [[GPUImageCropFilter alloc] initWithCropRegion:CGRectMake(0.0, 0.0, 0.5, 0.5)];
- }; break;
- case GPUIMAGE_TRANSFORM:
- {
- self.title = @"Transform (2-D)";
- self.filterSettingsSlider.hidden = NO;
-
- [self.filterSettingsSlider setMinimumValue:0.0];
- [self.filterSettingsSlider setMaximumValue:6.28];
- [self.filterSettingsSlider setValue:2.0];
-
- filter = [[GPUImageTransformFilter alloc] init];
- [(GPUImageTransformFilter *)filter setAffineTransform:CGAffineTransformMakeRotation(2.0)];
- }; break;
- case GPUIMAGE_TRANSFORM3D:
- {
- self.title = @"Transform (3-D)";
- self.filterSettingsSlider.hidden = NO;
-
- [self.filterSettingsSlider setMinimumValue:0.0];
- [self.filterSettingsSlider setMaximumValue:6.28];
- [self.filterSettingsSlider setValue:0.75];
-
- filter = [[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 *)filter setTransform3D:perspectiveTransform];
- }; break;
- case GPUIMAGE_SOBELEDGEDETECTION:
- {
- self.title = @"Edge Detection";
- self.filterSettingsSlider.hidden = YES;
-
- filter = [[GPUImageSobelEdgeDetectionFilter alloc] init];
- }; break;
- case GPUIMAGE_SKETCH:
- {
- self.title = @"Sketch";
- self.filterSettingsSlider.hidden = YES;
-
- filter = [[GPUImageSketchFilter alloc] init];
- }; break;
- case GPUIMAGE_TOON:
- {
- self.title = @"Toon";
- self.filterSettingsSlider.hidden = YES;
-
- filter = [[GPUImageToonFilter alloc] init];
- }; break;
- case GPUIMAGE_CGA:
- {
- self.title = @"CGA Colorspace";
- self.filterSettingsSlider.hidden = YES;
-
- filter = [[GPUImageCGAColorspaceFilter alloc] init];
- }; break;
-
- case GPUIMAGE_POSTERIZE:
- {
- self.title = @"Posterize";
- self.filterSettingsSlider.hidden = NO;
-
- [self.filterSettingsSlider setMinimumValue:1.0];
- [self.filterSettingsSlider setMaximumValue:20.0];
- [self.filterSettingsSlider setValue:10.0];
-
- filter = [[GPUImagePosterizeFilter alloc] init];
- }; break;
- case GPUIMAGE_SWIRL:
- {
- self.title = @"Swirl";
- self.filterSettingsSlider.hidden = NO;
-
- [self.filterSettingsSlider setMinimumValue:0.0];
- [self.filterSettingsSlider setMaximumValue:2.0];
- [self.filterSettingsSlider setValue:1.0];
-
- filter = [[GPUImageSwirlFilter alloc] init];
- }; break;
- case GPUIMAGE_BULGE:
- {
- self.title = @"Bulge";
- self.filterSettingsSlider.hidden = NO;
-
- [self.filterSettingsSlider setMinimumValue:-1.0];
- [self.filterSettingsSlider setMaximumValue:1.0];
- [self.filterSettingsSlider setValue:0.5];
-
- filter = [[GPUImageBulgeDistortionFilter alloc] init];
- }; break;
- case GPUIMAGE_PINCH:
- {
- self.title = @"Pinch";
- self.filterSettingsSlider.hidden = NO;
-
- [self.filterSettingsSlider setMinimumValue:-2.0];
- [self.filterSettingsSlider setMaximumValue:2.0];
- [self.filterSettingsSlider setValue:0.5];
-
- filter = [[GPUImagePinchDistortionFilter alloc] init];
- }; break;
- case GPUIMAGE_STRETCH:
- {
- self.title = @"Stretch";
- self.filterSettingsSlider.hidden = YES;
-
- filter = [[GPUImageStretchDistortionFilter alloc] init];
- }; break;
- case GPUIMAGE_CHROMAKEY:
- {
- self.title = @"Chroma Key (Green)";
- self.filterSettingsSlider.hidden = NO;
-
- [self.filterSettingsSlider setMinimumValue:0.0];
- [self.filterSettingsSlider setMaximumValue:1.0];
- [self.filterSettingsSlider setValue:0.4];
-
- filter = [[GPUImageChromaKeyBlendFilter alloc] init];
- [(GPUImageChromaKeyBlendFilter *)filter setColorToReplaceRed:0.0 green:1.0 blue:0.0];
- }; break;
- case GPUIMAGE_MULTIPLY:
- {
- self.title = @"Multiply Blend";
- self.filterSettingsSlider.hidden = YES;
-
- filter = [[GPUImageMultiplyBlendFilter alloc] init];
- }; break;
- case GPUIMAGE_OVERLAY:
- {
- self.title = @"Overlay Blend";
- self.filterSettingsSlider.hidden = YES;
-
- filter = [[GPUImageOverlayBlendFilter alloc] init];
- }; break;
- case GPUIMAGE_LIGHTEN:
- {
- self.title = @"Lighten Blend";
- self.filterSettingsSlider.hidden = YES;
-
- filter = [[GPUImageLightenBlendFilter alloc] init];
- }; break;
- case GPUIMAGE_DARKEN:
- {
- self.title = @"Darken Blend";
- self.filterSettingsSlider.hidden = YES;
-
- filter = [[GPUImageDarkenBlendFilter alloc] init];
- }; break;
- case GPUIMAGE_DISSOLVE:
- {
- self.title = @"Dissolve Blend";
- self.filterSettingsSlider.hidden = NO;
-
- [self.filterSettingsSlider setMinimumValue:0.0];
- [self.filterSettingsSlider setMaximumValue:1.0];
- [self.filterSettingsSlider setValue:0.5];
-
- filter = [[GPUImageDissolveBlendFilter alloc] init];
- }; break;
- case GPUIMAGE_SCREENBLEND:
- {
- self.title = @"Screen Blend";
- self.filterSettingsSlider.hidden = YES;
-
- filter = [[GPUImageScreenBlendFilter alloc] init];
- }; break;
- case GPUIMAGE_COLORBURN:
- {
- self.title = @"Color Burn Blend";
- self.filterSettingsSlider.hidden = YES;
-
- filter = [[GPUImageColorBurnBlendFilter alloc] init];
- }; break;
- case GPUIMAGE_COLORDODGE:
- {
- self.title = @"Color Dodge Blend";
- self.filterSettingsSlider.hidden = YES;
-
- filter = [[GPUImageColorDodgeBlendFilter alloc] init];
- }; break;
- case GPUIMAGE_EXCLUSIONBLEND:
- {
- self.title = @"Exlusion Blend";
- self.filterSettingsSlider.hidden = YES;
-
- filter = [[GPUImageExclusionBlendFilter alloc] init];
- }; break;
- case GPUIMAGE_DIFFERENCEBLEND:
- {
- self.title = @"Difference Blend";
- self.filterSettingsSlider.hidden = YES;
-
- filter = [[GPUImageDifferenceBlendFilter alloc] init];
- }; break;
- case GPUIMAGE_HARDLIGHTBLEND:
- {
- self.title = @"Hard Light Blend";
- self.filterSettingsSlider.hidden = YES;
-
- filter = [[GPUImageHardLightBlendFilter alloc] init];
- }; break;
- case GPUIMAGE_SOFTLIGHTBLEND:
- {
- self.title = @"Soft Light Blend";
- self.filterSettingsSlider.hidden = YES;
-
- filter = [[GPUImageSoftLightBlendFilter alloc] init];
- }; break;
- case GPUIMAGE_CUSTOM:
- {
- self.title = @"Custom";
- self.filterSettingsSlider.hidden = YES;
-
- filter = [[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"CustomFilter"];
- }; break;
- case GPUIMAGE_KUWAHARA:
- {
- self.title = @"Kuwahara";
- self.filterSettingsSlider.hidden = NO;
-
- [self.filterSettingsSlider setMinimumValue:3.0];
- [self.filterSettingsSlider setMaximumValue:8.0];
- [self.filterSettingsSlider setValue:3.0];
-
- filter = [[GPUImageKuwaharaFilter alloc] init];
- }; break;
-
- case GPUIMAGE_VIGNETTE:
- {
- self.title = @"Vignette";
- self.filterSettingsSlider.hidden = NO;
-
- [self.filterSettingsSlider setMinimumValue:-1.0];
- [self.filterSettingsSlider setMaximumValue:0.74];
- [self.filterSettingsSlider setValue:0.5];
-
- filter = [[GPUImageVignetteFilter alloc] init];
- }; break;
- case GPUIMAGE_GAUSSIAN:
- {
- self.title = @"Gaussian Blur";
- self.filterSettingsSlider.hidden = NO;
-
- [self.filterSettingsSlider setMinimumValue:0.0];
- [self.filterSettingsSlider setMaximumValue:10.0];
- [self.filterSettingsSlider setValue:1.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";
- self.filterSettingsSlider.hidden = YES;
-
- filter = [[GPUImageBoxBlurFilter alloc] init];
- }; break;
- case GPUIMAGE_GAUSSIAN_SELECTIVE:
- {
- 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 = [[GPUImageGaussianSelectiveBlurFilter alloc] init];
- [(GPUImageGaussianSelectiveBlurFilter*)filter setExcludeCircleRadius:40.0/320.0];
- }; break;
- case GPUIMAGE_FILTERGROUP:
- {
- self.title = @"Filter Group";
- self.filterSettingsSlider.hidden = NO;
-
- [self.filterSettingsSlider setValue:0.05];
- [self.filterSettingsSlider setMinimumValue:0.0];
- [self.filterSettingsSlider setMaximumValue:0.3];
-
- filter = [[GPUImageFilterGroup alloc] init];
-
- GPUImageSepiaFilter *sepiaFilter = [[GPUImageSepiaFilter alloc] init];
- [(GPUImageFilterGroup *)filter addFilter:sepiaFilter];
-
- GPUImagePixellateFilter *pixellateFilter = [[GPUImagePixellateFilter alloc] init];
- [(GPUImageFilterGroup *)filter addFilter:pixellateFilter];
-
- [sepiaFilter addTarget:pixellateFilter];
- [(GPUImageFilterGroup *)filter setInitialFilters:[NSArray arrayWithObject:sepiaFilter]];
- [(GPUImageFilterGroup *)filter setTerminalFilter:pixellateFilter];
- }; break;
-
- default: filter = [[GPUImageSepiaFilter alloc] init]; break;
- }
-
- if (filterType == GPUIMAGE_FILECONFIG)
- {
- self.title = @"File Configuration";
- pipeline = [[GPUImageFilterPipeline alloc] initWithConfigurationFile:[[NSBundle mainBundle] URLForResource:@"SampleConfiguration" withExtension:@"plist"]
- input:videoCamera output:(GPUImageView*)self.view];
-
- [pipeline addFilter:rotationFilter atIndex:0];
- }
- else
- {
- [videoCamera addTarget:rotationFilter];
- [rotationFilter addTarget:filter];
- videoCamera.runBenchmark = YES;
-
- if (filterType != GPUIMAGE_UNSHARPMASK)
- {
- // The picture is only used for two-image blend filters
- UIImage *inputImage = [UIImage imageNamed:@"WID-small.jpg"];
- sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES];
- [sourcePicture addTarget:filter];
- }
-
- GPUImageView *filterView = (GPUImageView *)self.view;
- [filter addTarget:filterView];
- }
-
- [videoCamera startCameraCapture];
-}
-
-#pragma mark -
-#pragma mark Filter adjustments
-
-- (IBAction)updateFilterFromSlider:(id)sender;
-{
- switch(filterType)
- {
- 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_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_EXPOSURE: [(GPUImageExposureFilter *)filter setExposure:[(UISlider *)sender value]]; break;
- case GPUIMAGE_SHARPEN: [(GPUImageSharpenFilter *)filter setSharpness:[(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;
- 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_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;
- case GPUIMAGE_SWIRL: [(GPUImageSwirlFilter *)filter setAngle:[(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;
- case GPUIMAGE_VIGNETTE: [(GPUImageVignetteFilter *)filter setY:[(UISlider *)sender value]]; break;
- case GPUIMAGE_GAUSSIAN: [(GPUImageGaussianBlurFilter *)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;
- 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_TRANSFORM: [(GPUImageTransformFilter *)filter setAffineTransform:CGAffineTransformMakeRotation([(UISlider*)sender value])]; 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, [(UISlider*)sender value], 0.0, 1.0, 0.0);
-
- [(GPUImageTransformFilter *)filter setTransform3D:perspectiveTransform];
- }; break;
- default: break;
- }
-}
-
-#pragma mark -
-#pragma mark Accessors
-
-@synthesize filterSettingsSlider = _filterSettingsSlider;
-
-@end
diff --git a/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj b/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj
new file mode 100644
index 000000000..9bb46c365
--- /dev/null
+++ b/examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj
@@ -0,0 +1,429 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ 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 */; };
+ 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 */; };
+ 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 */; };
+ 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 */
+ 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 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 */
+ 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 = ""; };
+ 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; };
+ 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; };
+ 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 */
+ BCF8676717263EAC00912E34 /* Frameworks */ = {
+ 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 */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ BCF8676117263EAC00912E34 = {
+ isa = PBXGroup;
+ children = (
+ 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 */,
+ BCF8680A17284D6A00912E34 /* QuartzCore.framework */,
+ BCF867A0172762B500912E34 /* AVFoundation.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 = (
+ BCA20BCB17471F5C0097C84A /* squares.png */,
+ BCA20BCC17471F5C0097C84A /* voroni_points2.png */,
+ 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 */,
+ 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 */,
+ BCB00A4B172B17E900DB804C /* CopyFiles */,
+ 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 = 0500;
+ 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 */,
+ 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 */,
+ BCA20BCD17471F5C0097C84A /* squares.png in Resources */,
+ BCA20BCE17471F5C0097C84A /* voroni_points2.png 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;
+ 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;
+ 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.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/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/BenchmarkSuite/BenchmarkSuite/en.lproj/InfoPlist.strings b/examples/Mac/FilterShowcase/FilterShowcase/en.lproj/InfoPlist.strings
similarity index 100%
rename from examples/BenchmarkSuite/BenchmarkSuite/en.lproj/InfoPlist.strings
rename to examples/Mac/FilterShowcase/FilterShowcase/en.lproj/InfoPlist.strings
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
+
+
+
+ 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..8c191fc01
--- /dev/null
+++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h
@@ -0,0 +1,134 @@
+#import
+#import
+
+typedef enum {
+ GPUIMAGE_SATURATION,
+ GPUIMAGE_CONTRAST,
+ GPUIMAGE_BRIGHTNESS,
+ GPUIMAGE_LEVELS,
+ GPUIMAGE_EXPOSURE,
+ GPUIMAGE_RGB,
+ GPUIMAGE_HUE,
+ GPUIMAGE_WHITEBALANCE,
+ GPUIMAGE_MONOCHROME,
+ GPUIMAGE_FALSECOLOR,
+ GPUIMAGE_SHARPEN,
+ GPUIMAGE_UNSHARPMASK,
+ GPUIMAGE_TRANSFORM,
+ GPUIMAGE_TRANSFORM3D,
+ GPUIMAGE_CROP,
+ GPUIMAGE_MASK,
+ GPUIMAGE_GAMMA,
+ GPUIMAGE_TONECURVE,
+ GPUIMAGE_HIGHLIGHTSHADOW,
+ GPUIMAGE_HAZE,
+ GPUIMAGE_SEPIA,
+ GPUIMAGE_AMATORKA,
+ GPUIMAGE_MISSETIKATE,
+ GPUIMAGE_SOFTELEGANCE,
+ GPUIMAGE_COLORINVERT,
+ GPUIMAGE_GRAYSCALE,
+ GPUIMAGE_HISTOGRAM,
+ GPUIMAGE_AVERAGECOLOR,
+ GPUIMAGE_LUMINOSITY,
+ GPUIMAGE_THRESHOLD,
+ 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_HARRISCORNERDETECTION,
+ GPUIMAGE_NOBLECORNERDETECTION,
+ GPUIMAGE_SHITOMASIFEATUREDETECTION,
+ GPUIMAGE_HOUGHTRANSFORMLINEDETECTOR,
+ GPUIMAGE_BUFFER,
+ GPUIMAGE_LOWPASS,
+ 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,
+ GPUIMAGE_BOXBLUR,
+ GPUIMAGE_MEDIAN,
+ 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,
+ 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;
+
+@interface SLSFilterShowcaseWindowController : NSWindowController
+{
+ GPUImageOutput *currentlySelectedFilter;
+ GPUImageAVCamera *inputCamera;
+ GPUImagePicture *imageForBlending;
+ 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..c34208206
--- /dev/null
+++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m
@@ -0,0 +1,1408 @@
+#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 cameraDevice:nil];
+ inputCamera.runBenchmark = YES;
+
+ currentlySelectedRow = 1;
+ [self changeSelectedRow:0];
+
+ [inputCamera startCameraCapture];
+}
+
+#pragma mark -
+#pragma mark Filter switching
+
+- (void)changeSelectedRow:(NSUInteger)newRowIndex;
+{
+ if (newRowIndex == currentlySelectedRow)
+ {
+ return;
+ }
+
+ currentlySelectedRow = newRowIndex;
+ BOOL needsSecondImage = NO;
+
+ if (currentlySelectedFilter != nil)
+ {
+ [inputCamera removeAllTargets];
+ [imageForBlending removeAllTargets];
+ // Disconnect older filter before replacing with new one
+ [currentlySelectedFilter removeAllTargets];
+ currentlySelectedFilter = nil;
+ }
+
+ 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];
+
+ self.minimumSliderValue = -1.0;
+ self.maximumSliderValue = 1.0;
+ 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_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_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_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_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_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_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_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];
+ 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_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.minimumSliderValue = 0.0;
+ self.maximumSliderValue = 2.0;
+ self.currentSliderValue = 1.0;
+ self.enableSlider = YES;
+ }; break;
+ case GPUIMAGE_PREWITTEDGEDETECTION:
+ {
+ currentlySelectedFilter = [[GPUImagePrewittEdgeDetectionFilter alloc] init];
+
+ self.minimumSliderValue = 0.0;
+ self.maximumSliderValue = 2.0;
+ self.currentSliderValue = 1.0;
+ self.enableSlider = YES;
+ }; 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];
+
+ 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.0;
+ self.maximumSliderValue = 1.0;
+ self.currentSliderValue = 0.25;
+ self.enableSlider = YES;
+ }; break;
+ case GPUIMAGE_TOON:
+ {
+ 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_SMOOTHTOON:
+ {
+ currentlySelectedFilter = [[GPUImageSmoothToonFilter alloc] init];
+ self.minimumSliderValue = 1.0;
+ self.maximumSliderValue = 6.0;
+ self.currentSliderValue = 1.0;
+ 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];
+ 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_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];
+
+ self.minimumSliderValue = 3.0;
+ self.maximumSliderValue = 8.0;
+ 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];
+
+ self.minimumSliderValue = 1.0;
+ self.maximumSliderValue = 24.0;
+ self.currentSliderValue = 2.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_BOXBLUR:
+ {
+ currentlySelectedFilter = [[GPUImageBoxBlurFilter alloc] init];
+
+ self.minimumSliderValue = 1.0;
+ self.maximumSliderValue = 24.0;
+ self.currentSliderValue = 2.0;
+ self.enableSlider = YES;
+ }; 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;
+ 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];
+
+ 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;
+ }
+
+ if (currentlySelectedRow != GPUIMAGE_VORONOI)
+ {
+ [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 ( (currentlySelectedRow == GPUIMAGE_OPACITY) || (currentlySelectedRow == GPUIMAGE_CHROMAKEYNONBLEND) )
+ {
+ [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];
+ }
+ 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];
+
+ // 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_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.blurRadiusInPixels = 10.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];
+
+ 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];
+ }
+ 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];
+ }
+
+}
+
+#pragma mark -
+#pragma mark Filter settings
+
+- (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_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_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_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 setBlurRadiusInPixels:_currentSliderValue]; break;
+ case GPUIMAGE_AVERAGELUMINANCETHRESHOLD: [(GPUImageAverageLuminanceThresholdFilter *)currentlySelectedFilter setThresholdMultiplier:_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;
+ 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_SKETCH: [(GPUImageSketchFilter *)currentlySelectedFilter setEdgeStrength:_currentSliderValue]; break;
+ case GPUIMAGE_THRESHOLDSKETCH: [(GPUImageThresholdSketchFilter *)currentlySelectedFilter setThreshold:_currentSliderValue]; break;
+ case GPUIMAGE_SMOOTHTOON: [(GPUImageSmoothToonFilter *)currentlySelectedFilter setBlurRadiusInPixels:_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;
+ 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 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_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;
+ case GPUIMAGE_OPACITY: [(GPUImageOpacityFilter *)currentlySelectedFilter setOpacity:_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_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_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_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_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_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_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;
+ 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_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_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;
+ 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;
+ 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;
+ 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;
+}
+
+- (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..dd32c444a
--- /dev/null
+++ b/examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.xib
@@ -0,0 +1,581 @@
+
+
+
+ 1080
+ 12D78
+ 3084
+ 1187.37
+ 626.00
+
+ com.apple.InterfaceBuilder.CocoaPlugin
+ 3084
+
+
+ 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
+
+
+
+ 276
+
+
+
+ 2304
+
+
+
+ 256
+ {164, 495}
+
+
+
+ _NS:13
+ YES
+ NO
+ YES
+
+
+
+ -2147483392
+ {{224, 0}, {16, 17}}
+
+ _NS:19
+
+
+
+ 159.62109375
+ 40
+ 1000
+
+
+ 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
+
+
+
+ 274
+ {{194, 53}, {640, 480}}
+
+
+
+ _NS:24
+
+
+ AAAAYAAAAAA
+
+
+
+
+
+ 290
+ {{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
+
+
+
+
+
+
+
+
+
+ 5
+
+
+
+
+
+
+
+
+
+
+ 6
+
+
+
+
+
+
+
+ 7
+
+
+
+
+ 8
+
+
+
+
+ 9
+
+
+
+
+ 10
+
+
+
+
+
+
+
+ 13
+
+
+
+
+ 24
+
+
+
+
+ 39
+
+
+
+
+
+
+
+ 40
+
+
+
+
+
+
+ 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
+ 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
+
+
+
+
+
+ 68
+
+
+
+
+ GPUImageView
+ NSOpenGLView
+
+ IBProjectSource
+ ./Classes/GPUImageView.h
+
+
+
+ SLSFilterShowcaseWindowController
+ NSWindowController
+
+ glView
+ GPUImageView
+
+
+ glView
+
+ glView
+ GPUImageView
+
+
+
+ IBProjectSource
+ ./Classes/SLSFilterShowcaseWindowController.h
+
+
+
+
+ 0
+ IBCocoaFramework
+ YES
+ 3
+
+
diff --git a/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift.xcodeproj/project.pbxproj b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift.xcodeproj/project.pbxproj
new file mode 100644
index 000000000..09f107c26
--- /dev/null
+++ b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift.xcodeproj/project.pbxproj
@@ -0,0 +1,538 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ BC0B247E197DF612009AC707 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC0B247D197DF612009AC707 /* AppDelegate.swift */; };
+ BC0B2480197DF612009AC707 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BC0B247F197DF612009AC707 /* Images.xcassets */; };
+ 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 */; };
+ BC61173C1981EB2B006121EE /* voroni_points2.png in Resources */ = {isa = PBXBuildFile; fileRef = BC61173B1981EB2B006121EE /* voroni_points2.png */; };
+ BC8B7D521A9BDB5E00E234F3 /* GPUImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC0B249D197DF7F7009AC707 /* GPUImage.framework */; };
+ BC8B7D541A9BDB7500E234F3 /* GPUImage.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = BC0B249D197DF7F7009AC707 /* GPUImage.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ BC8B7D561A9BDD1600E234F3 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC0B2481197DF612009AC707 /* MainMenu.xib */; };
+ BC8B7D581A9BDD7C00E234F3 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC8B7D571A9BDD7C00E234F3 /* main.swift */; };
+ BC8B7D591A9BDDB400E234F3 /* FilterShowcaseWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC0B24AB197E1372009AC707 /* FilterShowcaseWindowController.xib */; };
+ 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 PBXCopyFilesBuildPhase section */
+ BC8B7D531A9BDB6900E234F3 /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ BC8B7D541A9BDB7500E234F3 /* GPUImage.framework in CopyFiles */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase 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 = ""; };
+ 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 = ""; };
+ BC8B7D571A9BDD7C00E234F3 /* main.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = main.swift; 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 = (
+ BC8B7D521A9BDB5E00E234F3 /* GPUImage.framework in Frameworks */,
+ );
+ 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 = (
+ BC8B7D571A9BDD7C00E234F3 /* main.swift */,
+ BC0B2481197DF612009AC707 /* MainMenu.xib */,
+ 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 */,
+ BC8B7D531A9BDB6900E234F3 /* CopyFiles */,
+ );
+ 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 = {
+ LastSwiftUpdateCheck = 0700;
+ 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 */,
+ BCB4C100197F4D8A00C373B4 /* lookup_soft_elegance_2.png in Resources */,
+ BC8B7D591A9BDDB400E234F3 /* FilterShowcaseWindowController.xib 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 */,
+ BC8B7D561A9BDD1600E234F3 /* MainMenu.xib 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 */,
+ BC8B7D581A9BDD7C00E234F3 /* main.swift in Sources */,
+ BC0B24A3197DF822009AC707 /* FilterOperationTypes.swift in Sources */,
+ BC0B24AC197E1372009AC707 /* FilterShowcaseWindowController.swift in Sources */,
+ BC0B247E197DF612009AC707 /* AppDelegate.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..2100e2cb9
--- /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..d9840d3e8
--- /dev/null
+++ b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/Base.lproj/MainMenu.xib
@@ -0,0 +1,666 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/FilterShowcaseWindowController.swift b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/FilterShowcaseWindowController.swift
new file mode 100644
index 000000000..1f69199c9
--- /dev/null
+++ b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/FilterShowcaseWindowController.swift
@@ -0,0 +1,97 @@
+import Cocoa
+import GPUImage
+
+class FilterShowcaseWindowController: NSWindowController {
+
+ @IBOutlet var filterView: GPUImageView!
+
+ @IBOutlet weak var filterSlider: NSSlider!
+
+ 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 let .Custom(filterSetupFunction:setupFunction):
+ 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:
+ filterSlider.enabled = false
+ // case let .Enabled(minimumValue, initialValue, maximumValue, filterSliderCallback):
+ case let .Enabled(minimumValue, maximumValue, initialValue):
+ filterSlider.minValue = Double(minimumValue)
+ filterSlider.maxValue = Double(maximumValue)
+ filterSlider.enabled = 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!) {
+ 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
new file mode 100644
index 000000000..372926661
--- /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..8f35be478
--- /dev/null
+++ b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/main.swift
@@ -0,0 +1,3 @@
+import Cocoa
+
+NSApplicationMain(Process.argc, Process.unsafeArgv)
\ 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/framework/GPUImageTests/GPUImageTests-Info.plist b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwiftTests/Info.plist
similarity index 92%
rename from framework/GPUImageTests/GPUImageTests-Info.plist
rename to examples/Mac/FilterShowcaseSwift/FilterShowcaseSwiftTests/Info.plist
index d9fb51c3f..9a037bf5c 100644
--- a/framework/GPUImageTests/GPUImageTests-Info.plist
+++ b/examples/Mac/FilterShowcaseSwift/FilterShowcaseSwiftTests/Info.plist
@@ -10,6 +10,8 @@
com.sunsetlakesoftware.${PRODUCT_NAME:rfc1034identifier}
CFBundleInfoDictionaryVersion
6.0
+ CFBundleName
+ ${PRODUCT_NAME}
CFBundlePackageType
BNDL
CFBundleShortVersionString
diff --git a/examples/Mac/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj
new file mode 100644
index 000000000..96b4b1cdf
--- /dev/null
+++ b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj
@@ -0,0 +1,401 @@
+// !$*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 = 0500;
+ 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;
+ 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;
+ 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.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/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..77724e85a
--- /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 cameraDevice:nil];
+
+ 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/ColorObjectTracking/ColorObjectTracking/en.lproj/InfoPlist.strings b/examples/Mac/MultiViewFilterExample/MultiViewFilterExample/en.lproj/InfoPlist.strings
similarity index 100%
rename from examples/ColorObjectTracking/ColorObjectTracking/en.lproj/InfoPlist.strings
rename to examples/Mac/MultiViewFilterExample/MultiViewFilterExample/en.lproj/InfoPlist.strings
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
+
+
+
+ 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/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 000000000..58f06c8d9
Binary files /dev/null and b/examples/Mac/PlaygroundExample/PlaygroundExample/GPUImagePlayground.playground/Resources/ChairTest.png differ
diff --git a/examples/Mac/PlaygroundExample/PlaygroundExample/GPUImagePlayground.playground/Resources/CustomFilter.fsh b/examples/Mac/PlaygroundExample/PlaygroundExample/GPUImagePlayground.playground/Resources/CustomFilter.fsh
new file mode 100755
index 000000000..903a283bf
--- /dev/null
+++ b/examples/Mac/PlaygroundExample/PlaygroundExample/GPUImagePlayground.playground/Resources/CustomFilter.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/PlaygroundExample/PlaygroundExample/GPUImagePlayground.playground/contents.xcplayground b/examples/Mac/PlaygroundExample/PlaygroundExample/GPUImagePlayground.playground/contents.xcplayground
new file mode 100644
index 000000000..493763691
--- /dev/null
+++ b/examples/Mac/PlaygroundExample/PlaygroundExample/GPUImagePlayground.playground/contents.xcplayground
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ 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!")
+
diff --git a/examples/Mac/ShaderDesigner/ShaderDesigner.xcodeproj/project.pbxproj b/examples/Mac/ShaderDesigner/ShaderDesigner.xcodeproj/project.pbxproj
new file mode 100644
index 000000000..b38d6fb3f
--- /dev/null
+++ b/examples/Mac/ShaderDesigner/ShaderDesigner.xcodeproj/project.pbxproj
@@ -0,0 +1,361 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ BCD95D1E1A742B4300BC4F64 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = BCD95D1D1A742B4300BC4F64 /* AppDelegate.m */; };
+ BCD95D201A742B4300BC4F64 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = BCD95D1F1A742B4300BC4F64 /* main.m */; };
+ BCD95D221A742B4300BC4F64 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BCD95D211A742B4300BC4F64 /* Images.xcassets */; };
+ BCD95D251A742B4300BC4F64 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCD95D231A742B4300BC4F64 /* MainMenu.xib */; };
+ BCD95D3D1A742CFD00BC4F64 /* ShaderDesignerWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCD95D3B1A742CFD00BC4F64 /* ShaderDesignerWindowController.m */; };
+ BCD95D3E1A742CFD00BC4F64 /* ShaderDesignerWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCD95D3C1A742CFD00BC4F64 /* ShaderDesignerWindowController.xib */; };
+ BCF8E9D21A75D7A0005AE243 /* GPUImage.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = BCD95D451A7442FB00BC4F64 /* GPUImage.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ BCD95D441A7442FB00BC4F64 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BCD95D401A7442FB00BC4F64 /* GPUImageMac.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = BCA3F31C17239B6500E28AEC;
+ remoteInfo = GPUImage;
+ };
+ BCD95D461A74430E00BC4F64 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BCD95D401A7442FB00BC4F64 /* GPUImageMac.xcodeproj */;
+ proxyType = 1;
+ remoteGlobalIDString = BCA3F31B17239B6500E28AEC;
+ remoteInfo = GPUImage;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ BCF8E9D11A75D796005AE243 /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ BCF8E9D21A75D7A0005AE243 /* GPUImage.framework in CopyFiles */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ BCD95D171A742B4300BC4F64 /* ShaderDesigner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ShaderDesigner.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ BCD95D1B1A742B4300BC4F64 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ BCD95D1C1A742B4300BC4F64 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
+ BCD95D1D1A742B4300BC4F64 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; };
+ BCD95D1F1A742B4300BC4F64 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
+ BCD95D211A742B4300BC4F64 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; };
+ BCD95D241A742B4300BC4F64 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; };
+ BCD95D3A1A742CFD00BC4F64 /* ShaderDesignerWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShaderDesignerWindowController.h; sourceTree = ""; };
+ BCD95D3B1A742CFD00BC4F64 /* ShaderDesignerWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ShaderDesignerWindowController.m; sourceTree = ""; };
+ BCD95D3C1A742CFD00BC4F64 /* ShaderDesignerWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ShaderDesignerWindowController.xib; sourceTree = ""; };
+ BCD95D401A7442FB00BC4F64 /* GPUImageMac.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImageMac.xcodeproj; path = ../../../../framework/GPUImageMac.xcodeproj; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ BCD95D141A742B4300BC4F64 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ BCD95D0E1A742B4300BC4F64 = {
+ isa = PBXGroup;
+ children = (
+ BCD95D191A742B4300BC4F64 /* ShaderDesigner */,
+ BCD95D181A742B4300BC4F64 /* Products */,
+ );
+ sourceTree = "";
+ };
+ BCD95D181A742B4300BC4F64 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ BCD95D171A742B4300BC4F64 /* ShaderDesigner.app */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ BCD95D191A742B4300BC4F64 /* ShaderDesigner */ = {
+ isa = PBXGroup;
+ children = (
+ BCD95D1C1A742B4300BC4F64 /* AppDelegate.h */,
+ BCD95D1D1A742B4300BC4F64 /* AppDelegate.m */,
+ BCD95D231A742B4300BC4F64 /* MainMenu.xib */,
+ BCD95D3A1A742CFD00BC4F64 /* ShaderDesignerWindowController.h */,
+ BCD95D3B1A742CFD00BC4F64 /* ShaderDesignerWindowController.m */,
+ BCD95D3C1A742CFD00BC4F64 /* ShaderDesignerWindowController.xib */,
+ BCD95D211A742B4300BC4F64 /* Images.xcassets */,
+ BCD95D401A7442FB00BC4F64 /* GPUImageMac.xcodeproj */,
+ BCD95D1A1A742B4300BC4F64 /* Supporting Files */,
+ );
+ path = ShaderDesigner;
+ sourceTree = "";
+ };
+ BCD95D1A1A742B4300BC4F64 /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ BCD95D1B1A742B4300BC4F64 /* Info.plist */,
+ BCD95D1F1A742B4300BC4F64 /* main.m */,
+ );
+ name = "Supporting Files";
+ sourceTree = "";
+ };
+ BCD95D411A7442FB00BC4F64 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ BCD95D451A7442FB00BC4F64 /* GPUImage.framework */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ BCD95D161A742B4300BC4F64 /* ShaderDesigner */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = BCD95D341A742B4300BC4F64 /* Build configuration list for PBXNativeTarget "ShaderDesigner" */;
+ buildPhases = (
+ BCD95D131A742B4300BC4F64 /* Sources */,
+ BCD95D141A742B4300BC4F64 /* Frameworks */,
+ BCD95D151A742B4300BC4F64 /* Resources */,
+ BCF8E9D11A75D796005AE243 /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ BCD95D471A74430E00BC4F64 /* PBXTargetDependency */,
+ );
+ name = ShaderDesigner;
+ productName = ShaderDesigner;
+ productReference = BCD95D171A742B4300BC4F64 /* ShaderDesigner.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ BCD95D0F1A742B4300BC4F64 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0610;
+ ORGANIZATIONNAME = "Sunset Lake Software";
+ TargetAttributes = {
+ BCD95D161A742B4300BC4F64 = {
+ CreatedOnToolsVersion = 6.1.1;
+ };
+ };
+ };
+ buildConfigurationList = BCD95D121A742B4300BC4F64 /* Build configuration list for PBXProject "ShaderDesigner" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = BCD95D0E1A742B4300BC4F64;
+ productRefGroup = BCD95D181A742B4300BC4F64 /* Products */;
+ projectDirPath = "";
+ projectReferences = (
+ {
+ ProductGroup = BCD95D411A7442FB00BC4F64 /* Products */;
+ ProjectRef = BCD95D401A7442FB00BC4F64 /* GPUImageMac.xcodeproj */;
+ },
+ );
+ projectRoot = "";
+ targets = (
+ BCD95D161A742B4300BC4F64 /* ShaderDesigner */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXReferenceProxy section */
+ BCD95D451A7442FB00BC4F64 /* GPUImage.framework */ = {
+ isa = PBXReferenceProxy;
+ fileType = wrapper.framework;
+ path = GPUImage.framework;
+ remoteRef = BCD95D441A7442FB00BC4F64 /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+/* End PBXReferenceProxy section */
+
+/* Begin PBXResourcesBuildPhase section */
+ BCD95D151A742B4300BC4F64 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ BCD95D3E1A742CFD00BC4F64 /* ShaderDesignerWindowController.xib in Resources */,
+ BCD95D221A742B4300BC4F64 /* Images.xcassets in Resources */,
+ BCD95D251A742B4300BC4F64 /* MainMenu.xib in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ BCD95D131A742B4300BC4F64 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ BCD95D3D1A742CFD00BC4F64 /* ShaderDesignerWindowController.m in Sources */,
+ BCD95D201A742B4300BC4F64 /* main.m in Sources */,
+ BCD95D1E1A742B4300BC4F64 /* AppDelegate.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ BCD95D471A74430E00BC4F64 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ name = GPUImage;
+ targetProxy = BCD95D461A74430E00BC4F64 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ BCD95D231A742B4300BC4F64 /* MainMenu.xib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ BCD95D241A742B4300BC4F64 /* Base */,
+ );
+ name = MainMenu.xib;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ BCD95D321A742B4300BC4F64 /* 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.10;
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = macosx;
+ };
+ name = Debug;
+ };
+ BCD95D331A742B4300BC4F64 /* 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.10;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = macosx;
+ };
+ name = Release;
+ };
+ BCD95D351A742B4300BC4F64 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ COMBINE_HIDPI_IMAGES = YES;
+ INFOPLIST_FILE = ShaderDesigner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ BCD95D361A742B4300BC4F64 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ COMBINE_HIDPI_IMAGES = YES;
+ INFOPLIST_FILE = ShaderDesigner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ BCD95D121A742B4300BC4F64 /* Build configuration list for PBXProject "ShaderDesigner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ BCD95D321A742B4300BC4F64 /* Debug */,
+ BCD95D331A742B4300BC4F64 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ BCD95D341A742B4300BC4F64 /* Build configuration list for PBXNativeTarget "ShaderDesigner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ BCD95D351A742B4300BC4F64 /* Debug */,
+ BCD95D361A742B4300BC4F64 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = BCD95D0F1A742B4300BC4F64 /* Project object */;
+}
diff --git a/examples/Mac/ShaderDesigner/ShaderDesigner/AppDelegate.h b/examples/Mac/ShaderDesigner/ShaderDesigner/AppDelegate.h
new file mode 100644
index 000000000..35d036efb
--- /dev/null
+++ b/examples/Mac/ShaderDesigner/ShaderDesigner/AppDelegate.h
@@ -0,0 +1,10 @@
+#import
+#import "ShaderDesignerWindowController.h"
+
+@interface AppDelegate : NSObject
+{
+ ShaderDesignerWindowController *windowController;
+}
+
+@end
+
diff --git a/examples/Mac/ShaderDesigner/ShaderDesigner/AppDelegate.m b/examples/Mac/ShaderDesigner/ShaderDesigner/AppDelegate.m
new file mode 100644
index 000000000..5b2e77e23
--- /dev/null
+++ b/examples/Mac/ShaderDesigner/ShaderDesigner/AppDelegate.m
@@ -0,0 +1,16 @@
+#import "AppDelegate.h"
+
+@interface AppDelegate ()
+
+@property (weak) IBOutlet NSWindow *window;
+@end
+
+@implementation AppDelegate
+
+- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
+{
+ windowController = [[ShaderDesignerWindowController alloc] initWithWindowNibName:@"ShaderDesignerWindowController"];
+ [windowController showWindow:self];
+}
+
+@end
diff --git a/examples/Mac/ShaderDesigner/ShaderDesigner/Base.lproj/MainMenu.xib b/examples/Mac/ShaderDesigner/ShaderDesigner/Base.lproj/MainMenu.xib
new file mode 100644
index 000000000..9465c94eb
--- /dev/null
+++ b/examples/Mac/ShaderDesigner/ShaderDesigner/Base.lproj/MainMenu.xib
@@ -0,0 +1,417 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/Mac/ShaderDesigner/ShaderDesigner/Images.xcassets/AppIcon.appiconset/Contents.json b/examples/Mac/ShaderDesigner/ShaderDesigner/Images.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 000000000..2db2b1c7c
--- /dev/null
+++ b/examples/Mac/ShaderDesigner/ShaderDesigner/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/ShaderDesigner/ShaderDesigner/Info.plist b/examples/Mac/ShaderDesigner/ShaderDesigner/Info.plist
new file mode 100644
index 000000000..9dd8741ac
--- /dev/null
+++ b/examples/Mac/ShaderDesigner/ShaderDesigner/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 © 2015 Sunset Lake Software. All rights reserved.
+ NSMainNibFile
+ MainMenu
+ NSPrincipalClass
+ NSApplication
+
+
diff --git a/examples/Mac/ShaderDesigner/ShaderDesigner/ShaderDesignerWindowController.h b/examples/Mac/ShaderDesigner/ShaderDesigner/ShaderDesignerWindowController.h
new file mode 100644
index 000000000..98ac63dbb
--- /dev/null
+++ b/examples/Mac/ShaderDesigner/ShaderDesigner/ShaderDesignerWindowController.h
@@ -0,0 +1,31 @@
+#import
+#import
+
+@interface ShaderDesignerWindowController : NSWindowController
+{
+ GPUImageFilter *testFilter;
+ GPUImageAVCamera *inputCamera;
+}
+
+@property(readwrite, nonatomic) NSString *vertexShader;
+@property(readwrite, nonatomic) NSString *fragmentShader;
+@property(readwrite, nonatomic) NSString *compileLog;
+
+@property (weak) IBOutlet GPUImageView *previewView;
+@property (weak) IBOutlet GPUImageView *shaderOutputView;
+
+@property (weak) IBOutlet NSTabView *displayTabView;
+@property (weak) IBOutlet NSTabViewItem *displayTabItem;
+@property (weak) IBOutlet NSTabViewItem *logTabItem;
+
+@property (unsafe_unretained) IBOutlet NSTextView *vertexShaderTextView;
+@property (unsafe_unretained) IBOutlet NSTextView *fragmentShaderTextView;
+
+- (IBAction)compile:(id)sender;
+
+- (IBAction)openVertexShader:(id)sender;
+- (IBAction)openFragmentShader:(id)sender;
+- (IBAction)saveVertexShader:(id)sender;
+- (IBAction)saveFragmentShader:(id)sender;
+
+@end
diff --git a/examples/Mac/ShaderDesigner/ShaderDesigner/ShaderDesignerWindowController.m b/examples/Mac/ShaderDesigner/ShaderDesigner/ShaderDesignerWindowController.m
new file mode 100644
index 000000000..5dbca02d4
--- /dev/null
+++ b/examples/Mac/ShaderDesigner/ShaderDesigner/ShaderDesignerWindowController.m
@@ -0,0 +1,165 @@
+#import "ShaderDesignerWindowController.h"
+
+NSString *const kGPUImageInitialVertexShaderString = @"attribute vec4 position;\nattribute vec4 inputTextureCoordinate;\n\nvarying vec2 textureCoordinate;\n\nvoid main()\n{\n\tgl_Position = position;\n\ttextureCoordinate = inputTextureCoordinate.xy;\n}\n";
+
+NSString *const kGPUImageInitialFragmentShaderString = @"varying vec2 textureCoordinate;\n\nuniform sampler2D inputImageTexture;\n\nvoid main()\n{\n\tgl_FragColor = texture2D(inputImageTexture, textureCoordinate);\n}\n";
+
+
+@interface ShaderDesignerWindowController ()
+
+@end
+
+@implementation ShaderDesignerWindowController
+
+- (void)windowDidLoad
+{
+ [super windowDidLoad];
+
+ inputCamera = [[GPUImageAVCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraDevice:nil];
+// inputCamera.runBenchmark = YES;
+
+ self.vertexShader = kGPUImageInitialVertexShaderString;
+ self.fragmentShader = kGPUImageInitialFragmentShaderString;
+
+ [inputCamera addTarget:self.previewView];
+ self.previewView.fillMode = kGPUImageFillModePreserveAspectRatioAndFill;
+
+ [inputCamera startCameraCapture];
+
+ [self compile:self];
+}
+
+- (IBAction)compile:(id)sender;
+{
+ [self.window makeFirstResponder:nil];
+ // Test compilation first, see if it will work
+ __block BOOL compilationFailed = NO;
+ runSynchronouslyOnVideoProcessingQueue(^{
+ [GPUImageContext useImageProcessingContext];
+ GLProgram *filterProgram = [[GLProgram alloc] initWithVertexShaderString:self.vertexShader fragmentShaderString:self.fragmentShader];
+
+ if (!filterProgram.initialized)
+ {
+ if (![filterProgram link])
+ {
+ compilationFailed = YES;
+ [self.displayTabView selectTabViewItem:self.logTabItem];
+ self.compileLog = [NSString stringWithFormat:@"Vertex shader log:\n%@\n\nFragment shader log:\n%@\n\nProgram log:\n%@\n\n", [filterProgram programLog], [filterProgram fragmentShaderLog], [filterProgram vertexShaderLog]];
+ }
+ }
+ });
+ if (compilationFailed)
+ {
+ return;
+ }
+
+ [self.displayTabView selectTabViewItem:self.displayTabItem];
+
+ [inputCamera pauseCameraCapture];
+ if (testFilter != nil)
+ {
+ [inputCamera removeTarget:testFilter];
+ [testFilter removeTarget:self.shaderOutputView];
+ }
+ testFilter = [[GPUImageFilter alloc] initWithVertexShaderFromString:self.vertexShader fragmentShaderFromString:self.fragmentShader];
+
+ [inputCamera addTarget:testFilter];
+ [testFilter addTarget:self.shaderOutputView];
+
+ [inputCamera resumeCameraCapture];
+}
+
+#pragma mark -
+#pragma mark File loading / saving
+
+- (IBAction)openVertexShader:(id)sender;
+{
+ NSOpenPanel *shaderLoadingDialog = [NSOpenPanel openPanel];
+ [shaderLoadingDialog setAllowedFileTypes:[NSArray arrayWithObjects:@"vsh", @"txt", nil]];
+
+ if ( [shaderLoadingDialog runModal] == NSModalResponseOK )
+ {
+ NSError *error = nil;
+ NSString *fileContents = [NSString stringWithContentsOfURL:[shaderLoadingDialog URL] encoding:NSASCIIStringEncoding error:&error];
+ if (fileContents == nil)
+ {
+ if (error == nil)
+ {
+ NSLog(@"Don't have an error to present for failing to save topography map");
+ }
+
+ [NSApp presentError:error];
+ }
+ else
+ {
+ self.vertexShader = fileContents;
+ }
+ }
+}
+
+- (IBAction)openFragmentShader:(id)sender;
+{
+ NSOpenPanel *shaderLoadingDialog = [NSOpenPanel openPanel];
+ [shaderLoadingDialog setAllowedFileTypes:[NSArray arrayWithObjects:@"fsh", @"txt", nil]];
+
+ if ( [shaderLoadingDialog runModal] == NSModalResponseOK )
+ {
+ NSError *error = nil;
+ NSString *fileContents = [NSString stringWithContentsOfURL:[shaderLoadingDialog URL] encoding:NSASCIIStringEncoding error:&error];
+ if (fileContents == nil)
+ {
+ if (error == nil)
+ {
+ NSLog(@"Don't have an error to present for failing to save topography map");
+ }
+
+ [NSApp presentError:error];
+ }
+ else
+ {
+ self.fragmentShader = fileContents;
+ }
+ }
+}
+
+- (IBAction)saveVertexShader:(id)sender;
+{
+ NSSavePanel *shaderSavingDialog = [NSSavePanel savePanel];
+ [shaderSavingDialog setAllowedFileTypes:[NSArray arrayWithObjects:@"vsh", @"txt", nil]];
+
+ if ( [shaderSavingDialog runModal] == NSModalResponseOK )
+ {
+ NSError *error = nil;
+ if (![self.vertexShader writeToURL:[shaderSavingDialog URL] atomically:NO encoding:NSASCIIStringEncoding error:&error])
+ {
+ if (error == nil)
+ {
+ NSLog(@"Don't have an error to present for failing to save topography map");
+ }
+
+ [NSApp presentError:error];
+ }
+ }
+}
+
+- (IBAction)saveFragmentShader:(id)sender;
+{
+ NSSavePanel *shaderSavingDialog = [NSSavePanel savePanel];
+ [shaderSavingDialog setAllowedFileTypes:[NSArray arrayWithObjects:@"fsh", @"txt", nil]];
+
+ if ( [shaderSavingDialog runModal] == NSModalResponseOK )
+ {
+ NSError *error = nil;
+ if (![self.fragmentShader writeToURL:[shaderSavingDialog URL] atomically:NO encoding:NSASCIIStringEncoding error:&error])
+ {
+ if (error == nil)
+ {
+ NSLog(@"Don't have an error to present for failing to save topography map");
+ }
+
+ [NSApp presentError:error];
+ }
+ }
+}
+
+@end
diff --git a/examples/Mac/ShaderDesigner/ShaderDesigner/ShaderDesignerWindowController.xib b/examples/Mac/ShaderDesigner/ShaderDesigner/ShaderDesignerWindowController.xib
new file mode 100644
index 000000000..56222920e
--- /dev/null
+++ b/examples/Mac/ShaderDesigner/ShaderDesigner/ShaderDesignerWindowController.xib
@@ -0,0 +1,216 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/Mac/ShaderDesigner/ShaderDesigner/main.m b/examples/Mac/ShaderDesigner/ShaderDesigner/main.m
new file mode 100644
index 000000000..8a6799b41
--- /dev/null
+++ b/examples/Mac/ShaderDesigner/ShaderDesigner/main.m
@@ -0,0 +1,5 @@
+#import
+
+int main(int argc, const char * argv[]) {
+ return NSApplicationMain(argc, argv);
+}
diff --git a/examples/Mac/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj
new file mode 100644
index 000000000..4edc58c75
--- /dev/null
+++ b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj
@@ -0,0 +1,389 @@
+// !$*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 = (
+ BCA3F3581723A2E800E28AEC /* MainMenu.xib */,
+ BCA3F3521723A2E800E28AEC /* SLSDocument.h */,
+ BCA3F3531723A2E800E28AEC /* SLSDocument.m */,
+ BCA3F3551723A2E800E28AEC /* SLSDocument.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 */,
+ BCA3F33A1723A2E800E28AEC /* Frameworks */,
+ BCA3F33B1723A2E800E28AEC /* Resources */,
+ BCF40F341724AF95005AE36A /* CopyFiles */,
+ );
+ 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 = 0500;
+ 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;
+ 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.7;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = macosx;
+ };
+ name = Debug;
+ };
+ BCA3F35C1723A2E800E28AEC /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ 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.7;
+ 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.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/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..3c18b9ded
--- /dev/null
+++ b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/SLSDocument.m
@@ -0,0 +1,83 @@
+#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 addTarget:self.imageView];
+// [inputPicture processImage];
+
+ [inputPicture addTarget:imageFilter];
+ GPUImageSketchFilter *sketchFilter = [[GPUImageSketchFilter alloc] init];
+ [imageFilter addTarget:sketchFilter];
+ [sketchFilter 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/FilterShowcase/FilterShowcase/en.lproj/InfoPlist.strings b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/InfoPlist.strings
similarity index 100%
rename from examples/FilterShowcase/FilterShowcase/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
+
+
+
+ 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..99b5a7a22
--- /dev/null
+++ b/examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/SLSDocument.xib
@@ -0,0 +1,537 @@
+
+
+
+ 1070
+ 13A598
+ 4514
+ 1265
+ 695.00
+
+ com.apple.InterfaceBuilder.CocoaPlugin
+ 4514
+
+
+ IBNSLayoutConstraint
+ NSCustomObject
+ NSOpenGLView
+ NSSlider
+ NSSliderCell
+ NSView
+ NSWindowTemplate
+
+
+ com.apple.InterfaceBuilder.CocoaPlugin
+
+
+ PluginDependencyRecalculationVersion
+
+
+
+
+ SLSDocument
+
+
+ FirstResponder
+
+
+ 15
+ 2
+ {{133, 235}, {507, 413}}
+ 1618477056
+ Window
+ NSWindow
+ View
+
+ {94, 86}
+
+
+ 256
+
+
+
+ 268
+ {{0, 54}, {507, 359}}
+
+
+
+ _NS:24
+
+
+ AAAAYAAAAAA
+
+
+
+
+
+ 268
+ {{18, 18}, {471, 21}}
+
+
+
+ _NS:9
+ YES
+
+ -2080112384
+ 0
+
+ _NS:9
+
+ 1
+ -1
+ 0.0
+ 0.0
+ 0
+ 1
+ NO
+ NO
+
+ NO
+
+
+ {507, 413}
+
+
+
+
+ {{0, 0}, {2560, 1418}}
+ {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
+
+ 0
+ 29
+ 3
+ NO
+
+
+
+ 5
+ 0
+
+ 5
+ 1
+
+ 20
+
+ 1000
+
+ 0
+ 29
+ 3
+ NO
+
+
+
+ 4
+ 0
+
+ 4
+ 1
+
+ 20
+
+ 1000
+
+ 0
+ 29
+ 3
+ NO
+
+
+
+ 4
+ 0
+
+ 4
+ 1
+
+ 54
+
+ 1000
+
+ 3
+ 9
+ 3
+ NO
+
+
+
+ 6
+ 0
+
+ 6
+ 1
+
+ 0.0
+
+ 1000
+
+ 0
+ 29
+ 3
+ NO
+
+
+
+ 3
+ 0
+
+ 3
+ 1
+
+ 0.0
+
+ 1000
+
+ 0
+ 29
+ 3
+ NO
+
+
+
+ 5
+ 0
+
+ 5
+ 1
+
+ 0.0
+
+ 1000
+
+ 0
+ 29
+ 3
+ NO
+
+
+
+
+
+
+
+ -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
+ 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
+
+ IBProjectSource
+ ./Classes/NSLayoutConstraint.h
+
+
+
+ SLSDocument
+ NSDocument
+
+ imageView
+ GPUImageView
+
+
+ imageView
+
+ imageView
+ GPUImageView
+
+
+
+ IBProjectSource
+ ./Classes/SLSDocument.h
+
+
+
+
+ 0
+ IBCocoaFramework
+ YES
+
+ com.apple.InterfaceBuilder.CocoaPlugin.macosx
+
+
+
+ com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3
+
+
+ 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/Mac/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj b/examples/Mac/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj
new file mode 100644
index 000000000..1006246a8
--- /dev/null
+++ b/examples/Mac/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj
@@ -0,0 +1,500 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 575AD8C91BEA6FC60088E866 /* sample_iPod.m4v in Resources */ = {isa = PBXBuildFile; fileRef = 575AD8C81BEA6FC60088E866 /* sample_iPod.m4v */; settings = {ASSET_TAGS = (); }; };
+ 79C26E221A5EDD1C0054857C /* SLSSimpleVideoFileFilterWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 79C26E211A5EDD1C0054857C /* SLSSimpleVideoFileFilterWindowController.m */; };
+ 79C26E2E1A5F02B70054857C /* SLSSimpleVideoFileFilterWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 79C26E2D1A5F02B70054857C /* SLSSimpleVideoFileFilterWindowController.xib */; };
+ 79E8A5FB1A5ED6A700E6A226 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 79E8A5FA1A5ED6A700E6A226 /* AppDelegate.m */; };
+ 79E8A5FD1A5ED6A700E6A226 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 79E8A5FC1A5ED6A700E6A226 /* main.m */; };
+ 79E8A5FF1A5ED6A700E6A226 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 79E8A5FE1A5ED6A700E6A226 /* Images.xcassets */; };
+ 79E8A6021A5ED6A700E6A226 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 79E8A6001A5ED6A700E6A226 /* MainMenu.xib */; };
+ 79E8A60E1A5ED6A700E6A226 /* SimpleVideoFilterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 79E8A60D1A5ED6A700E6A226 /* SimpleVideoFilterTests.m */; };
+ BCF8E9E51A75DE67005AE243 /* GPUImage.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = BCF8E9E21A75DE3F005AE243 /* GPUImage.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 79E8A6081A5ED6A700E6A226 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 79E8A5EC1A5ED6A700E6A226 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 79E8A5F31A5ED6A700E6A226;
+ remoteInfo = SimpleVideoFilter;
+ };
+ BCF8E9E11A75DE3F005AE243 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BCF8E9DD1A75DE3F005AE243 /* GPUImageMac.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = BCA3F31C17239B6500E28AEC;
+ remoteInfo = GPUImage;
+ };
+ BCF8E9E31A75DE5B005AE243 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BCF8E9DD1A75DE3F005AE243 /* GPUImageMac.xcodeproj */;
+ proxyType = 1;
+ remoteGlobalIDString = BCA3F31B17239B6500E28AEC;
+ remoteInfo = GPUImage;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 79C26E251A5EE5210054857C /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ BCF8E9E51A75DE67005AE243 /* GPUImage.framework in CopyFiles */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 575AD8C81BEA6FC60088E866 /* sample_iPod.m4v */ = {isa = PBXFileReference; lastKnownFileType = file; path = sample_iPod.m4v; sourceTree = ""; };
+ 79C26E201A5EDD1C0054857C /* SLSSimpleVideoFileFilterWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SLSSimpleVideoFileFilterWindowController.h; sourceTree = ""; };
+ 79C26E211A5EDD1C0054857C /* SLSSimpleVideoFileFilterWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SLSSimpleVideoFileFilterWindowController.m; sourceTree = ""; };
+ 79C26E2D1A5F02B70054857C /* SLSSimpleVideoFileFilterWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SLSSimpleVideoFileFilterWindowController.xib; sourceTree = ""; };
+ 79E8A5F41A5ED6A700E6A226 /* SimpleVideoFileFilter.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SimpleVideoFileFilter.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 79E8A5F81A5ED6A700E6A226 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 79E8A5F91A5ED6A700E6A226 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
+ 79E8A5FA1A5ED6A700E6A226 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; };
+ 79E8A5FC1A5ED6A700E6A226 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
+ 79E8A5FE1A5ED6A700E6A226 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; };
+ 79E8A6011A5ED6A700E6A226 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; };
+ 79E8A6071A5ED6A700E6A226 /* SimpleVideoFileFilter.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SimpleVideoFileFilter.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+ 79E8A60C1A5ED6A700E6A226 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 79E8A60D1A5ED6A700E6A226 /* SimpleVideoFilterTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SimpleVideoFilterTests.m; sourceTree = ""; };
+ BCF8E9DD1A75DE3F005AE243 /* GPUImageMac.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImageMac.xcodeproj; path = ../../../../framework/GPUImageMac.xcodeproj; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 79E8A5F11A5ED6A700E6A226 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 79E8A6041A5ED6A700E6A226 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 79E8A5EB1A5ED6A700E6A226 = {
+ isa = PBXGroup;
+ children = (
+ 79E8A5F61A5ED6A700E6A226 /* SimpleVideoFileFilter */,
+ 79E8A61D1A5ED97400E6A226 /* Frameworks */,
+ 79E8A60A1A5ED6A700E6A226 /* SimpleVideoFilterTests */,
+ 79E8A5F51A5ED6A700E6A226 /* Products */,
+ );
+ sourceTree = "";
+ };
+ 79E8A5F51A5ED6A700E6A226 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 79E8A5F41A5ED6A700E6A226 /* SimpleVideoFileFilter.app */,
+ 79E8A6071A5ED6A700E6A226 /* SimpleVideoFileFilter.xctest */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 79E8A5F61A5ED6A700E6A226 /* SimpleVideoFileFilter */ = {
+ isa = PBXGroup;
+ children = (
+ 79E8A5F91A5ED6A700E6A226 /* AppDelegate.h */,
+ 79E8A5FA1A5ED6A700E6A226 /* AppDelegate.m */,
+ 79C26E201A5EDD1C0054857C /* SLSSimpleVideoFileFilterWindowController.h */,
+ 79C26E211A5EDD1C0054857C /* SLSSimpleVideoFileFilterWindowController.m */,
+ 79C26E2D1A5F02B70054857C /* SLSSimpleVideoFileFilterWindowController.xib */,
+ 79E8A5FE1A5ED6A700E6A226 /* Images.xcassets */,
+ 79E8A6001A5ED6A700E6A226 /* MainMenu.xib */,
+ 79E8A5F71A5ED6A700E6A226 /* Supporting Files */,
+ );
+ name = SimpleVideoFileFilter;
+ path = SimpleVideoFilter;
+ sourceTree = "";
+ };
+ 79E8A5F71A5ED6A700E6A226 /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ 575AD8C81BEA6FC60088E866 /* sample_iPod.m4v */,
+ 79E8A5F81A5ED6A700E6A226 /* Info.plist */,
+ 79E8A5FC1A5ED6A700E6A226 /* main.m */,
+ );
+ name = "Supporting Files";
+ sourceTree = "";
+ };
+ 79E8A60A1A5ED6A700E6A226 /* SimpleVideoFilterTests */ = {
+ isa = PBXGroup;
+ children = (
+ 79E8A60D1A5ED6A700E6A226 /* SimpleVideoFilterTests.m */,
+ 79E8A60B1A5ED6A700E6A226 /* Supporting Files */,
+ );
+ path = SimpleVideoFilterTests;
+ sourceTree = "";
+ };
+ 79E8A60B1A5ED6A700E6A226 /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ 79E8A60C1A5ED6A700E6A226 /* Info.plist */,
+ );
+ name = "Supporting Files";
+ sourceTree = "";
+ };
+ 79E8A61D1A5ED97400E6A226 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ BCF8E9DD1A75DE3F005AE243 /* GPUImageMac.xcodeproj */,
+ );
+ name = Frameworks;
+ path = SimpleVideoFilterTests;
+ sourceTree = "";
+ };
+ BCF8E9DE1A75DE3F005AE243 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ BCF8E9E21A75DE3F005AE243 /* GPUImage.framework */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 79E8A5F31A5ED6A700E6A226 /* SimpleVideoFileFilter */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 79E8A6111A5ED6A700E6A226 /* Build configuration list for PBXNativeTarget "SimpleVideoFileFilter" */;
+ buildPhases = (
+ 79E8A5F01A5ED6A700E6A226 /* Sources */,
+ 79E8A5F11A5ED6A700E6A226 /* Frameworks */,
+ 79E8A5F21A5ED6A700E6A226 /* Resources */,
+ 79C26E251A5EE5210054857C /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ BCF8E9E41A75DE5B005AE243 /* PBXTargetDependency */,
+ );
+ name = SimpleVideoFileFilter;
+ productName = SimpleVideoFilter;
+ productReference = 79E8A5F41A5ED6A700E6A226 /* SimpleVideoFileFilter.app */;
+ productType = "com.apple.product-type.application";
+ };
+ 79E8A6061A5ED6A700E6A226 /* SimpleVideoFileFilterTests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 79E8A6141A5ED6A700E6A226 /* Build configuration list for PBXNativeTarget "SimpleVideoFileFilterTests" */;
+ buildPhases = (
+ 79E8A6031A5ED6A700E6A226 /* Sources */,
+ 79E8A6041A5ED6A700E6A226 /* Frameworks */,
+ 79E8A6051A5ED6A700E6A226 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 79E8A6091A5ED6A700E6A226 /* PBXTargetDependency */,
+ );
+ name = SimpleVideoFileFilterTests;
+ productName = SimpleVideoFilterTests;
+ productReference = 79E8A6071A5ED6A700E6A226 /* SimpleVideoFileFilter.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 79E8A5EC1A5ED6A700E6A226 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0610;
+ ORGANIZATIONNAME = "Red Queen Coder, LLC";
+ TargetAttributes = {
+ 79E8A5F31A5ED6A700E6A226 = {
+ CreatedOnToolsVersion = 6.1.1;
+ };
+ 79E8A6061A5ED6A700E6A226 = {
+ CreatedOnToolsVersion = 6.1.1;
+ TestTargetID = 79E8A5F31A5ED6A700E6A226;
+ };
+ };
+ };
+ buildConfigurationList = 79E8A5EF1A5ED6A700E6A226 /* Build configuration list for PBXProject "SimpleVideoFileFilter" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 79E8A5EB1A5ED6A700E6A226;
+ productRefGroup = 79E8A5F51A5ED6A700E6A226 /* Products */;
+ projectDirPath = "";
+ projectReferences = (
+ {
+ ProductGroup = BCF8E9DE1A75DE3F005AE243 /* Products */;
+ ProjectRef = BCF8E9DD1A75DE3F005AE243 /* GPUImageMac.xcodeproj */;
+ },
+ );
+ projectRoot = "";
+ targets = (
+ 79E8A5F31A5ED6A700E6A226 /* SimpleVideoFileFilter */,
+ 79E8A6061A5ED6A700E6A226 /* SimpleVideoFileFilterTests */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXReferenceProxy section */
+ BCF8E9E21A75DE3F005AE243 /* GPUImage.framework */ = {
+ isa = PBXReferenceProxy;
+ fileType = wrapper.framework;
+ path = GPUImage.framework;
+ remoteRef = BCF8E9E11A75DE3F005AE243 /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+/* End PBXReferenceProxy section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 79E8A5F21A5ED6A700E6A226 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 79E8A5FF1A5ED6A700E6A226 /* Images.xcassets in Resources */,
+ 575AD8C91BEA6FC60088E866 /* sample_iPod.m4v in Resources */,
+ 79C26E2E1A5F02B70054857C /* SLSSimpleVideoFileFilterWindowController.xib in Resources */,
+ 79E8A6021A5ED6A700E6A226 /* MainMenu.xib in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 79E8A6051A5ED6A700E6A226 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 79E8A5F01A5ED6A700E6A226 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 79E8A5FD1A5ED6A700E6A226 /* main.m in Sources */,
+ 79E8A5FB1A5ED6A700E6A226 /* AppDelegate.m in Sources */,
+ 79C26E221A5EDD1C0054857C /* SLSSimpleVideoFileFilterWindowController.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 79E8A6031A5ED6A700E6A226 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 79E8A60E1A5ED6A700E6A226 /* SimpleVideoFilterTests.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 79E8A6091A5ED6A700E6A226 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 79E8A5F31A5ED6A700E6A226 /* SimpleVideoFileFilter */;
+ targetProxy = 79E8A6081A5ED6A700E6A226 /* PBXContainerItemProxy */;
+ };
+ BCF8E9E41A75DE5B005AE243 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ name = GPUImage;
+ targetProxy = BCF8E9E31A75DE5B005AE243 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ 79E8A6001A5ED6A700E6A226 /* MainMenu.xib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 79E8A6011A5ED6A700E6A226 /* Base */,
+ );
+ name = MainMenu.xib;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 79E8A60F1A5ED6A700E6A226 /* 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.10;
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = macosx;
+ };
+ name = Debug;
+ };
+ 79E8A6101A5ED6A700E6A226 /* 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.10;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = macosx;
+ };
+ name = Release;
+ };
+ 79E8A6121A5ED6A700E6A226 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ COMBINE_HIDPI_IMAGES = YES;
+ INFOPLIST_FILE = SimpleVideoFilter/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
+ PRODUCT_NAME = SimpleVideoFileFilter;
+ };
+ name = Debug;
+ };
+ 79E8A6131A5ED6A700E6A226 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ COMBINE_HIDPI_IMAGES = YES;
+ INFOPLIST_FILE = SimpleVideoFilter/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
+ PRODUCT_NAME = SimpleVideoFileFilter;
+ };
+ name = Release;
+ };
+ 79E8A6151A5ED6A700E6A226 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ COMBINE_HIDPI_IMAGES = YES;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(DEVELOPER_FRAMEWORKS_DIR)",
+ "$(inherited)",
+ );
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ INFOPLIST_FILE = SimpleVideoFilterTests/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
+ PRODUCT_NAME = SimpleVideoFileFilter;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SimpleVideoFileFilter.app/Contents/MacOS/SimpleVideoFileFilter";
+ };
+ name = Debug;
+ };
+ 79E8A6161A5ED6A700E6A226 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ COMBINE_HIDPI_IMAGES = YES;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(DEVELOPER_FRAMEWORKS_DIR)",
+ "$(inherited)",
+ );
+ INFOPLIST_FILE = SimpleVideoFilterTests/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
+ PRODUCT_NAME = SimpleVideoFileFilter;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SimpleVideoFileFilter.app/Contents/MacOS/SimpleVideoFileFilter";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 79E8A5EF1A5ED6A700E6A226 /* Build configuration list for PBXProject "SimpleVideoFileFilter" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 79E8A60F1A5ED6A700E6A226 /* Debug */,
+ 79E8A6101A5ED6A700E6A226 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 79E8A6111A5ED6A700E6A226 /* Build configuration list for PBXNativeTarget "SimpleVideoFileFilter" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 79E8A6121A5ED6A700E6A226 /* Debug */,
+ 79E8A6131A5ED6A700E6A226 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 79E8A6141A5ED6A700E6A226 /* Build configuration list for PBXNativeTarget "SimpleVideoFileFilterTests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 79E8A6151A5ED6A700E6A226 /* Debug */,
+ 79E8A6161A5ED6A700E6A226 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 79E8A5EC1A5ED6A700E6A226 /* Project object */;
+}
diff --git a/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/AppDelegate.h b/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/AppDelegate.h
new file mode 100644
index 000000000..ab53e3b6d
--- /dev/null
+++ b/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/AppDelegate.h
@@ -0,0 +1,10 @@
+#import
+#import "SLSSimpleVideoFileFilterWindowController.h"
+
+@interface AppDelegate : NSObject
+{
+ SLSSimpleVideoFileFilterWindowController *simpleVideoFileFilterWindowController;
+}
+
+@end
+
diff --git a/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/AppDelegate.m b/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/AppDelegate.m
new file mode 100644
index 000000000..3142c1d8c
--- /dev/null
+++ b/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/AppDelegate.m
@@ -0,0 +1,21 @@
+#import "AppDelegate.h"
+#import
+
+@interface AppDelegate ()
+
+@property (weak) IBOutlet NSWindow *window;
+@end
+
+@implementation AppDelegate
+
+- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
+ // Insert code here to initialize your application
+ simpleVideoFileFilterWindowController = [[SLSSimpleVideoFileFilterWindowController alloc] initWithWindowNibName:@"SLSSimpleVideoFileFilterWindowController"];
+ [simpleVideoFileFilterWindowController showWindow:self];
+}
+
+- (void)applicationWillTerminate:(NSNotification *)aNotification {
+ // Insert code here to tear down your application
+}
+
+@end
diff --git a/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/Base.lproj/MainMenu.xib b/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/Base.lproj/MainMenu.xib
new file mode 100644
index 000000000..7396d8880
--- /dev/null
+++ b/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/Base.lproj/MainMenu.xib
@@ -0,0 +1,676 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Default
+
+
+
+
+
+
+ Left to Right
+
+
+
+
+
+
+ Right to Left
+
+
+
+
+
+
+
+
+
+
+ Default
+
+
+
+
+
+
+ Left to Right
+
+
+
+
+
+
+ Right to Left
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/Images.xcassets/AppIcon.appiconset/Contents.json b/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/Images.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 000000000..2db2b1c7c
--- /dev/null
+++ b/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/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/SimpleVideoFileFilter/SimpleVideoFilter/Info.plist b/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/Info.plist
new file mode 100644
index 000000000..f3cc20d03
--- /dev/null
+++ b/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/Info.plist
@@ -0,0 +1,34 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIconFile
+
+ CFBundleIdentifier
+ com.redqueencoder.$(PRODUCT_NAME:rfc1034identifier)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1
+ LSMinimumSystemVersion
+ $(MACOSX_DEPLOYMENT_TARGET)
+ NSHumanReadableCopyright
+ Copyright © 2015 Red Queen Coder, LLC. All rights reserved.
+ NSMainNibFile
+ MainMenu
+ NSPrincipalClass
+ NSApplication
+
+
diff --git a/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/SLSSimpleVideoFileFilterWindowController.h b/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/SLSSimpleVideoFileFilterWindowController.h
new file mode 100644
index 000000000..3860944be
--- /dev/null
+++ b/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/SLSSimpleVideoFileFilterWindowController.h
@@ -0,0 +1,5 @@
+#import
+
+@interface SLSSimpleVideoFileFilterWindowController : NSWindowController
+
+@end
diff --git a/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/SLSSimpleVideoFileFilterWindowController.m b/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/SLSSimpleVideoFileFilterWindowController.m
new file mode 100644
index 000000000..5c2cb6b44
--- /dev/null
+++ b/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/SLSSimpleVideoFileFilterWindowController.m
@@ -0,0 +1,116 @@
+#import "SLSSimpleVideoFileFilterWindowController.h"
+#import
+
+@interface SLSSimpleVideoFileFilterWindowController ()
+{
+ GPUImageMovie *movieFile;
+ GPUImageOutput *filter;
+ GPUImageMovieWriter *movieWriter;
+ NSTimer * timer;
+}
+
+@property (weak) IBOutlet GPUImageView *videoView;
+@property (weak) IBOutlet NSTextField *progressLabel;
+
+@property (weak) IBOutlet NSView *containerView;
+@property (weak) IBOutlet NSButton *urlButton;
+@property (weak) IBOutlet NSButton *avPlayerItemButton;
+
+@property (nonatomic, strong) AVPlayerItem *playerItem;
+@property (nonatomic, strong) AVPlayer *player;
+
+@end
+
+@implementation SLSSimpleVideoFileFilterWindowController
+
+
+- (void)windowDidLoad {
+ [super windowDidLoad];
+
+ self.containerView.hidden = YES;
+
+}
+
+- (IBAction)gpuImageMovieWithURLButtonAction:(id)sender {
+ [self runProcessingWithAVPlayerItem:NO];
+ [self showProcessingUI];
+}
+
+- (IBAction)gpuImageMovieWithAvplayeritemButtonAction:(id)sender {
+ [self runProcessingWithAVPlayerItem:YES];
+ [self showProcessingUI];
+}
+
+- (void)showProcessingUI {
+ self.containerView.hidden = NO;
+ self.urlButton.hidden = YES;
+ self.avPlayerItemButton.hidden = YES;
+}
+
+- (void)runProcessingWithAVPlayerItem:(BOOL)withAVPlayerItem {
+ NSURL *sampleURL = [[NSBundle mainBundle] URLForResource:@"sample_iPod" withExtension:@"m4v"];
+
+ self.playerItem = [[AVPlayerItem alloc] initWithURL:sampleURL];
+ self.player = [AVPlayer playerWithPlayerItem:self.playerItem];
+
+ //movieFile = [[GPUImageMovie alloc] initWithURL:sampleURL];
+ movieFile = [[GPUImageMovie alloc] initWithPlayerItem:self.playerItem];
+ movieFile.runBenchmark = YES;
+ movieFile.playAtActualSpeed = NO;
+ filter = [[GPUImagePixellateFilter alloc] init];
+ // filter = [[GPUImageUnsharpMaskFilter alloc] init];
+
+ [movieFile addTarget:filter];
+
+ // Only rotate the video for display, leave orientation the same for recording
+ GPUImageView *filterView = (GPUImageView *)self.videoView;
+ [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"];
+ 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(640.0, 480.0)];
+ [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;
+ [movieFile enableSynchronizedEncodingUsingMovieWriter:movieWriter];
+
+ [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.stringValue = @"100%";
+ });
+ }];
+
+ [self.player play];
+}
+
+- (void)retrievingProgress
+{
+ self.progressLabel.stringValue = [NSString stringWithFormat:@"%d%%", (int)(movieFile.progress * 100)];
+}
+
+- (IBAction)updatePixelWidth:(id)sender
+{
+ // [(GPUImageUnsharpMaskFilter *)filter setIntensity:[(UISlider *)sender value]];
+ [(GPUImagePixellateFilter *)filter setFractionalWidthOfAPixel:[(NSSlider *)sender floatValue]];
+}
+
+
+@end
diff --git a/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/SLSSimpleVideoFileFilterWindowController.xib b/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/SLSSimpleVideoFileFilterWindowController.xib
new file mode 100644
index 000000000..73be63722
--- /dev/null
+++ b/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/SLSSimpleVideoFileFilterWindowController.xib
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/main.m b/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/main.m
new file mode 100644
index 000000000..303f9ce6c
--- /dev/null
+++ b/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/main.m
@@ -0,0 +1,13 @@
+//
+// main.m
+// SimpleVideoFilter
+//
+// Created by Janie Clayton-Hasz on 1/8/15.
+// Copyright (c) 2015 Red Queen Coder, LLC. All rights reserved.
+//
+
+#import
+
+int main(int argc, const char * argv[]) {
+ return NSApplicationMain(argc, argv);
+}
diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/sample_iPod.m4v b/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/sample_iPod.m4v
similarity index 100%
rename from examples/SimpleVideoFileFilter/SimpleVideoFileFilter/sample_iPod.m4v
rename to examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/sample_iPod.m4v
diff --git a/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilterTests/Info.plist b/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilterTests/Info.plist
new file mode 100644
index 000000000..8ff6f557a
--- /dev/null
+++ b/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilterTests/Info.plist
@@ -0,0 +1,24 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ com.redqueencoder.$(PRODUCT_NAME:rfc1034identifier)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ BNDL
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1
+
+
diff --git a/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilterTests/SimpleVideoFilterTests.m b/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilterTests/SimpleVideoFilterTests.m
new file mode 100644
index 000000000..179e59bd5
--- /dev/null
+++ b/examples/Mac/SimpleVideoFileFilter/SimpleVideoFilterTests/SimpleVideoFilterTests.m
@@ -0,0 +1,40 @@
+//
+// SimpleVideoFilterTests.m
+// SimpleVideoFilterTests
+//
+// Created by Janie Clayton-Hasz on 1/8/15.
+// Copyright (c) 2015 Red Queen Coder, LLC. All rights reserved.
+//
+
+#import
+#import
+
+@interface SimpleVideoFilterTests : XCTestCase
+
+@end
+
+@implementation SimpleVideoFilterTests
+
+- (void)setUp {
+ [super setUp];
+ // Put setup code here. This method is called before the invocation of each test method in the class.
+}
+
+- (void)tearDown {
+ // Put teardown code here. This method is called after the invocation of each test method in the class.
+ [super tearDown];
+}
+
+- (void)testExample {
+ // This is an example of a functional test case.
+ XCTAssert(YES, @"Pass");
+}
+
+- (void)testPerformanceExample {
+ // This is an example of a performance test case.
+ [self measureBlock:^{
+ // Put the code you want to measure the time of here.
+ }];
+}
+
+@end
diff --git a/examples/Mac/SimpleVideoFilter/SimpleVideoFilter.xcodeproj/project.pbxproj b/examples/Mac/SimpleVideoFilter/SimpleVideoFilter.xcodeproj/project.pbxproj
new file mode 100644
index 000000000..9ad08db0d
--- /dev/null
+++ b/examples/Mac/SimpleVideoFilter/SimpleVideoFilter.xcodeproj/project.pbxproj
@@ -0,0 +1,495 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 79C26E221A5EDD1C0054857C /* SLSSimpleVideoFilterWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 79C26E211A5EDD1C0054857C /* SLSSimpleVideoFilterWindowController.m */; };
+ 79C26E2E1A5F02B70054857C /* SLSSimpleVideoFilterWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 79C26E2D1A5F02B70054857C /* SLSSimpleVideoFilterWindowController.xib */; };
+ 79E8A5FB1A5ED6A700E6A226 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 79E8A5FA1A5ED6A700E6A226 /* AppDelegate.m */; };
+ 79E8A5FD1A5ED6A700E6A226 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 79E8A5FC1A5ED6A700E6A226 /* main.m */; };
+ 79E8A5FF1A5ED6A700E6A226 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 79E8A5FE1A5ED6A700E6A226 /* Images.xcassets */; };
+ 79E8A6021A5ED6A700E6A226 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 79E8A6001A5ED6A700E6A226 /* MainMenu.xib */; };
+ 79E8A60E1A5ED6A700E6A226 /* SimpleVideoFilterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 79E8A60D1A5ED6A700E6A226 /* SimpleVideoFilterTests.m */; };
+ BCF8E9E51A75DE67005AE243 /* GPUImage.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = BCF8E9E21A75DE3F005AE243 /* GPUImage.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 79E8A6081A5ED6A700E6A226 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 79E8A5EC1A5ED6A700E6A226 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 79E8A5F31A5ED6A700E6A226;
+ remoteInfo = SimpleVideoFilter;
+ };
+ BCF8E9E11A75DE3F005AE243 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BCF8E9DD1A75DE3F005AE243 /* GPUImageMac.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = BCA3F31C17239B6500E28AEC;
+ remoteInfo = GPUImage;
+ };
+ BCF8E9E31A75DE5B005AE243 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BCF8E9DD1A75DE3F005AE243 /* GPUImageMac.xcodeproj */;
+ proxyType = 1;
+ remoteGlobalIDString = BCA3F31B17239B6500E28AEC;
+ remoteInfo = GPUImage;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 79C26E251A5EE5210054857C /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ BCF8E9E51A75DE67005AE243 /* GPUImage.framework in CopyFiles */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 79C26E201A5EDD1C0054857C /* SLSSimpleVideoFilterWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SLSSimpleVideoFilterWindowController.h; path = SimpleVideoFilter/SLSSimpleVideoFilterWindowController.h; sourceTree = SOURCE_ROOT; };
+ 79C26E211A5EDD1C0054857C /* SLSSimpleVideoFilterWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SLSSimpleVideoFilterWindowController.m; path = SimpleVideoFilter/SLSSimpleVideoFilterWindowController.m; sourceTree = SOURCE_ROOT; };
+ 79C26E2D1A5F02B70054857C /* SLSSimpleVideoFilterWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = SLSSimpleVideoFilterWindowController.xib; path = SimpleVideoFilter/SLSSimpleVideoFilterWindowController.xib; sourceTree = SOURCE_ROOT; };
+ 79E8A5F41A5ED6A700E6A226 /* SimpleVideoFilter.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SimpleVideoFilter.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 79E8A5F81A5ED6A700E6A226 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 79E8A5F91A5ED6A700E6A226 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
+ 79E8A5FA1A5ED6A700E6A226 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; };
+ 79E8A5FC1A5ED6A700E6A226 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
+ 79E8A5FE1A5ED6A700E6A226 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; };
+ 79E8A6011A5ED6A700E6A226 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; };
+ 79E8A6071A5ED6A700E6A226 /* SimpleVideoFilterTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SimpleVideoFilterTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+ 79E8A60C1A5ED6A700E6A226 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 79E8A60D1A5ED6A700E6A226 /* SimpleVideoFilterTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SimpleVideoFilterTests.m; sourceTree = ""; };
+ BCF8E9DD1A75DE3F005AE243 /* GPUImageMac.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GPUImageMac.xcodeproj; path = ../../../../framework/GPUImageMac.xcodeproj; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 79E8A5F11A5ED6A700E6A226 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 79E8A6041A5ED6A700E6A226 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 79E8A5EB1A5ED6A700E6A226 = {
+ isa = PBXGroup;
+ children = (
+ 79E8A5F61A5ED6A700E6A226 /* SimpleVideoFilter */,
+ 79E8A61D1A5ED97400E6A226 /* Frameworks */,
+ 79E8A60A1A5ED6A700E6A226 /* SimpleVideoFilterTests */,
+ 79E8A5F51A5ED6A700E6A226 /* Products */,
+ );
+ sourceTree = "";
+ };
+ 79E8A5F51A5ED6A700E6A226 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 79E8A5F41A5ED6A700E6A226 /* SimpleVideoFilter.app */,
+ 79E8A6071A5ED6A700E6A226 /* SimpleVideoFilterTests.xctest */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 79E8A5F61A5ED6A700E6A226 /* SimpleVideoFilter */ = {
+ isa = PBXGroup;
+ children = (
+ 79E8A5F91A5ED6A700E6A226 /* AppDelegate.h */,
+ 79E8A5FA1A5ED6A700E6A226 /* AppDelegate.m */,
+ 79C26E201A5EDD1C0054857C /* SLSSimpleVideoFilterWindowController.h */,
+ 79C26E211A5EDD1C0054857C /* SLSSimpleVideoFilterWindowController.m */,
+ 79C26E2D1A5F02B70054857C /* SLSSimpleVideoFilterWindowController.xib */,
+ 79E8A5FE1A5ED6A700E6A226 /* Images.xcassets */,
+ 79E8A6001A5ED6A700E6A226 /* MainMenu.xib */,
+ 79E8A5F71A5ED6A700E6A226 /* Supporting Files */,
+ );
+ path = SimpleVideoFilter;
+ sourceTree = "";
+ };
+ 79E8A5F71A5ED6A700E6A226 /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ 79E8A5F81A5ED6A700E6A226 /* Info.plist */,
+ 79E8A5FC1A5ED6A700E6A226 /* main.m */,
+ );
+ name = "Supporting Files";
+ sourceTree = "";
+ };
+ 79E8A60A1A5ED6A700E6A226 /* SimpleVideoFilterTests */ = {
+ isa = PBXGroup;
+ children = (
+ 79E8A60D1A5ED6A700E6A226 /* SimpleVideoFilterTests.m */,
+ 79E8A60B1A5ED6A700E6A226 /* Supporting Files */,
+ );
+ path = SimpleVideoFilterTests;
+ sourceTree = "";
+ };
+ 79E8A60B1A5ED6A700E6A226 /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ 79E8A60C1A5ED6A700E6A226 /* Info.plist */,
+ );
+ name = "Supporting Files";
+ sourceTree = "";
+ };
+ 79E8A61D1A5ED97400E6A226 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ BCF8E9DD1A75DE3F005AE243 /* GPUImageMac.xcodeproj */,
+ );
+ name = Frameworks;
+ path = SimpleVideoFilterTests;
+ sourceTree = "";
+ };
+ BCF8E9DE1A75DE3F005AE243 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ BCF8E9E21A75DE3F005AE243 /* GPUImage.framework */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 79E8A5F31A5ED6A700E6A226 /* SimpleVideoFilter */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 79E8A6111A5ED6A700E6A226 /* Build configuration list for PBXNativeTarget "SimpleVideoFilter" */;
+ buildPhases = (
+ 79E8A5F01A5ED6A700E6A226 /* Sources */,
+ 79E8A5F11A5ED6A700E6A226 /* Frameworks */,
+ 79E8A5F21A5ED6A700E6A226 /* Resources */,
+ 79C26E251A5EE5210054857C /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ BCF8E9E41A75DE5B005AE243 /* PBXTargetDependency */,
+ );
+ name = SimpleVideoFilter;
+ productName = SimpleVideoFilter;
+ productReference = 79E8A5F41A5ED6A700E6A226 /* SimpleVideoFilter.app */;
+ productType = "com.apple.product-type.application";
+ };
+ 79E8A6061A5ED6A700E6A226 /* SimpleVideoFilterTests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 79E8A6141A5ED6A700E6A226 /* Build configuration list for PBXNativeTarget "SimpleVideoFilterTests" */;
+ buildPhases = (
+ 79E8A6031A5ED6A700E6A226 /* Sources */,
+ 79E8A6041A5ED6A700E6A226 /* Frameworks */,
+ 79E8A6051A5ED6A700E6A226 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 79E8A6091A5ED6A700E6A226 /* PBXTargetDependency */,
+ );
+ name = SimpleVideoFilterTests;
+ productName = SimpleVideoFilterTests;
+ productReference = 79E8A6071A5ED6A700E6A226 /* SimpleVideoFilterTests.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 79E8A5EC1A5ED6A700E6A226 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0610;
+ ORGANIZATIONNAME = "Red Queen Coder, LLC";
+ TargetAttributes = {
+ 79E8A5F31A5ED6A700E6A226 = {
+ CreatedOnToolsVersion = 6.1.1;
+ };
+ 79E8A6061A5ED6A700E6A226 = {
+ CreatedOnToolsVersion = 6.1.1;
+ TestTargetID = 79E8A5F31A5ED6A700E6A226;
+ };
+ };
+ };
+ buildConfigurationList = 79E8A5EF1A5ED6A700E6A226 /* Build configuration list for PBXProject "SimpleVideoFilter" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 79E8A5EB1A5ED6A700E6A226;
+ productRefGroup = 79E8A5F51A5ED6A700E6A226 /* Products */;
+ projectDirPath = "";
+ projectReferences = (
+ {
+ ProductGroup = BCF8E9DE1A75DE3F005AE243 /* Products */;
+ ProjectRef = BCF8E9DD1A75DE3F005AE243 /* GPUImageMac.xcodeproj */;
+ },
+ );
+ projectRoot = "";
+ targets = (
+ 79E8A5F31A5ED6A700E6A226 /* SimpleVideoFilter */,
+ 79E8A6061A5ED6A700E6A226 /* SimpleVideoFilterTests */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXReferenceProxy section */
+ BCF8E9E21A75DE3F005AE243 /* GPUImage.framework */ = {
+ isa = PBXReferenceProxy;
+ fileType = wrapper.framework;
+ path = GPUImage.framework;
+ remoteRef = BCF8E9E11A75DE3F005AE243 /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+/* End PBXReferenceProxy section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 79E8A5F21A5ED6A700E6A226 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 79E8A5FF1A5ED6A700E6A226 /* Images.xcassets in Resources */,
+ 79C26E2E1A5F02B70054857C /* SLSSimpleVideoFilterWindowController.xib in Resources */,
+ 79E8A6021A5ED6A700E6A226 /* MainMenu.xib in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 79E8A6051A5ED6A700E6A226 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 79E8A5F01A5ED6A700E6A226 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 79E8A5FD1A5ED6A700E6A226 /* main.m in Sources */,
+ 79E8A5FB1A5ED6A700E6A226 /* AppDelegate.m in Sources */,
+ 79C26E221A5EDD1C0054857C /* SLSSimpleVideoFilterWindowController.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 79E8A6031A5ED6A700E6A226 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 79E8A60E1A5ED6A700E6A226 /* SimpleVideoFilterTests.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 79E8A6091A5ED6A700E6A226 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 79E8A5F31A5ED6A700E6A226 /* SimpleVideoFilter */;
+ targetProxy = 79E8A6081A5ED6A700E6A226 /* PBXContainerItemProxy */;
+ };
+ BCF8E9E41A75DE5B005AE243 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ name = GPUImage;
+ targetProxy = BCF8E9E31A75DE5B005AE243 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ 79E8A6001A5ED6A700E6A226 /* MainMenu.xib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 79E8A6011A5ED6A700E6A226 /* Base */,
+ );
+ name = MainMenu.xib;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 79E8A60F1A5ED6A700E6A226 /* 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.10;
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = macosx;
+ };
+ name = Debug;
+ };
+ 79E8A6101A5ED6A700E6A226 /* 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.10;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = macosx;
+ };
+ name = Release;
+ };
+ 79E8A6121A5ED6A700E6A226 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ COMBINE_HIDPI_IMAGES = YES;
+ INFOPLIST_FILE = SimpleVideoFilter/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ 79E8A6131A5ED6A700E6A226 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ COMBINE_HIDPI_IMAGES = YES;
+ INFOPLIST_FILE = SimpleVideoFilter/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ 79E8A6151A5ED6A700E6A226 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ COMBINE_HIDPI_IMAGES = YES;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(DEVELOPER_FRAMEWORKS_DIR)",
+ "$(inherited)",
+ );
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ INFOPLIST_FILE = SimpleVideoFilterTests/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SimpleVideoFilter.app/Contents/MacOS/SimpleVideoFilter";
+ };
+ name = Debug;
+ };
+ 79E8A6161A5ED6A700E6A226 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ COMBINE_HIDPI_IMAGES = YES;
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(DEVELOPER_FRAMEWORKS_DIR)",
+ "$(inherited)",
+ );
+ INFOPLIST_FILE = SimpleVideoFilterTests/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SimpleVideoFilter.app/Contents/MacOS/SimpleVideoFilter";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 79E8A5EF1A5ED6A700E6A226 /* Build configuration list for PBXProject "SimpleVideoFilter" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 79E8A60F1A5ED6A700E6A226 /* Debug */,
+ 79E8A6101A5ED6A700E6A226 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 79E8A6111A5ED6A700E6A226 /* Build configuration list for PBXNativeTarget "SimpleVideoFilter" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 79E8A6121A5ED6A700E6A226 /* Debug */,
+ 79E8A6131A5ED6A700E6A226 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 79E8A6141A5ED6A700E6A226 /* Build configuration list for PBXNativeTarget "SimpleVideoFilterTests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 79E8A6151A5ED6A700E6A226 /* Debug */,
+ 79E8A6161A5ED6A700E6A226 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 79E8A5EC1A5ED6A700E6A226 /* Project object */;
+}
diff --git a/examples/Mac/SimpleVideoFilter/SimpleVideoFilter/AppDelegate.h b/examples/Mac/SimpleVideoFilter/SimpleVideoFilter/AppDelegate.h
new file mode 100644
index 000000000..c1c40a604
--- /dev/null
+++ b/examples/Mac/SimpleVideoFilter/SimpleVideoFilter/AppDelegate.h
@@ -0,0 +1,10 @@
+#import
+#import "SLSSimpleVideoFilterWindowController.h"
+
+@interface AppDelegate : NSObject
+{
+ SLSSimpleVideoFilterWindowController *simpleVideoFilterWindowController;
+}
+
+@end
+
diff --git a/examples/Mac/SimpleVideoFilter/SimpleVideoFilter/AppDelegate.m b/examples/Mac/SimpleVideoFilter/SimpleVideoFilter/AppDelegate.m
new file mode 100644
index 000000000..3ef5521f4
--- /dev/null
+++ b/examples/Mac/SimpleVideoFilter/SimpleVideoFilter/AppDelegate.m
@@ -0,0 +1,21 @@
+#import "AppDelegate.h"
+#import
+
+@interface AppDelegate ()
+
+@property (weak) IBOutlet NSWindow *window;
+@end
+
+@implementation AppDelegate
+
+- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
+ // Insert code here to initialize your application
+ simpleVideoFilterWindowController = [[SLSSimpleVideoFilterWindowController alloc] initWithWindowNibName:@"SLSSimpleVideoFilterWindowController"];
+ [simpleVideoFilterWindowController showWindow:self];
+}
+
+- (void)applicationWillTerminate:(NSNotification *)aNotification {
+ // Insert code here to tear down your application
+}
+
+@end
diff --git a/examples/Mac/SimpleVideoFilter/SimpleVideoFilter/Base.lproj/MainMenu.xib b/examples/Mac/SimpleVideoFilter/SimpleVideoFilter/Base.lproj/MainMenu.xib
new file mode 100644
index 000000000..63481a236
--- /dev/null
+++ b/examples/Mac/SimpleVideoFilter/SimpleVideoFilter/Base.lproj/MainMenu.xib
@@ -0,0 +1,676 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Default
+
+
+
+
+
+
+ Left to Right
+
+
+
+
+
+
+ Right to Left
+
+
+
+
+
+
+
+
+
+
+ Default
+
+
+
+
+
+
+ Left to Right
+
+
+
+
+
+
+ Right to Left
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/Mac/SimpleVideoFilter/SimpleVideoFilter/Images.xcassets/AppIcon.appiconset/Contents.json b/examples/Mac/SimpleVideoFilter/SimpleVideoFilter/Images.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 000000000..2db2b1c7c
--- /dev/null
+++ b/examples/Mac/SimpleVideoFilter/SimpleVideoFilter/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/SimpleVideoFilter/SimpleVideoFilter/Info.plist b/examples/Mac/SimpleVideoFilter/SimpleVideoFilter/Info.plist
new file mode 100644
index 000000000..f3cc20d03
--- /dev/null
+++ b/examples/Mac/SimpleVideoFilter/SimpleVideoFilter/Info.plist
@@ -0,0 +1,34 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIconFile
+
+ CFBundleIdentifier
+ com.redqueencoder.$(PRODUCT_NAME:rfc1034identifier)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1
+ LSMinimumSystemVersion
+ $(MACOSX_DEPLOYMENT_TARGET)
+ NSHumanReadableCopyright
+ Copyright © 2015 Red Queen Coder, LLC. All rights reserved.
+ NSMainNibFile
+ MainMenu
+ NSPrincipalClass
+ NSApplication
+
+
diff --git a/examples/Mac/SimpleVideoFilter/SimpleVideoFilter/SLSSimpleVideoFilterWindowController.h b/examples/Mac/SimpleVideoFilter/SimpleVideoFilter/SLSSimpleVideoFilterWindowController.h
new file mode 100644
index 000000000..98ffdd077
--- /dev/null
+++ b/examples/Mac/SimpleVideoFilter/SimpleVideoFilter/SLSSimpleVideoFilterWindowController.h
@@ -0,0 +1,13 @@
+#import
+#import
+
+@interface SLSSimpleVideoFilterWindowController : NSWindowController
+{
+ GPUImageAVCamera *videoCamera;
+ GPUImageOutput *filter;
+ GPUImageMovieWriter *movieWriter;
+}
+
+@property (weak) IBOutlet GPUImageView *videoView;
+
+@end
diff --git a/examples/Mac/SimpleVideoFilter/SimpleVideoFilter/SLSSimpleVideoFilterWindowController.m b/examples/Mac/SimpleVideoFilter/SimpleVideoFilter/SLSSimpleVideoFilterWindowController.m
new file mode 100644
index 000000000..502f7361c
--- /dev/null
+++ b/examples/Mac/SimpleVideoFilter/SimpleVideoFilter/SLSSimpleVideoFilterWindowController.m
@@ -0,0 +1,65 @@
+#import "SLSSimpleVideoFilterWindowController.h"
+
+@interface SLSSimpleVideoFilterWindowController ()
+
+@end
+
+@implementation SLSSimpleVideoFilterWindowController
+
+
+- (void)windowDidLoad {
+ [super windowDidLoad];
+
+ // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
+
+ // Instantiate video camera
+ videoCamera = [[GPUImageAVCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraDevice:nil];
+ videoCamera.runBenchmark = YES;
+
+ // Create filter and add it to target
+ filter = [[GPUImageSepiaFilter alloc] init];
+ [videoCamera addTarget:filter];
+
+ // Save video to desktop
+ NSError *error = nil;
+
+ NSURL *pathToDesktop = [[NSFileManager defaultManager] URLForDirectory:NSDesktopDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:&error];
+ NSURL *pathToMovieFile = [pathToDesktop URLByAppendingPathComponent:@"movie.mp4"];
+ NSString *filePathString = [pathToMovieFile absoluteString];
+ NSString *filePathSubstring = [filePathString substringFromIndex:7];
+ unlink([filePathSubstring UTF8String]);
+
+ // Instantiate movie writer and add targets
+ movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:pathToMovieFile size:CGSizeMake(640.0, 480.0)];
+ movieWriter.encodingLiveVideo = YES;
+
+ self.videoView.fillMode = kGPUImageFillModePreserveAspectRatio;
+ [filter addTarget:movieWriter];
+ [filter addTarget:self.videoView];
+
+ // Start capturing
+ [videoCamera startCameraCapture];
+
+ 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");
+
+ });
+ });
+
+}
+
+@end
diff --git a/examples/Mac/SimpleVideoFilter/SimpleVideoFilter/SLSSimpleVideoFilterWindowController.xib b/examples/Mac/SimpleVideoFilter/SimpleVideoFilter/SLSSimpleVideoFilterWindowController.xib
new file mode 100644
index 000000000..90d66050c
--- /dev/null
+++ b/examples/Mac/SimpleVideoFilter/SimpleVideoFilter/SLSSimpleVideoFilterWindowController.xib
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/Mac/SimpleVideoFilter/SimpleVideoFilter/main.m b/examples/Mac/SimpleVideoFilter/SimpleVideoFilter/main.m
new file mode 100644
index 000000000..303f9ce6c
--- /dev/null
+++ b/examples/Mac/SimpleVideoFilter/SimpleVideoFilter/main.m
@@ -0,0 +1,13 @@
+//
+// main.m
+// SimpleVideoFilter
+//
+// Created by Janie Clayton-Hasz on 1/8/15.
+// Copyright (c) 2015 Red Queen Coder, LLC. All rights reserved.
+//
+
+#import
+
+int main(int argc, const char * argv[]) {
+ return NSApplicationMain(argc, argv);
+}
diff --git a/examples/Mac/SimpleVideoFilter/SimpleVideoFilterTests/Info.plist b/examples/Mac/SimpleVideoFilter/SimpleVideoFilterTests/Info.plist
new file mode 100644
index 000000000..8ff6f557a
--- /dev/null
+++ b/examples/Mac/SimpleVideoFilter/SimpleVideoFilterTests/Info.plist
@@ -0,0 +1,24 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ com.redqueencoder.$(PRODUCT_NAME:rfc1034identifier)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ BNDL
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1
+
+
diff --git a/examples/Mac/SimpleVideoFilter/SimpleVideoFilterTests/SimpleVideoFilterTests.m b/examples/Mac/SimpleVideoFilter/SimpleVideoFilterTests/SimpleVideoFilterTests.m
new file mode 100644
index 000000000..179e59bd5
--- /dev/null
+++ b/examples/Mac/SimpleVideoFilter/SimpleVideoFilterTests/SimpleVideoFilterTests.m
@@ -0,0 +1,40 @@
+//
+// SimpleVideoFilterTests.m
+// SimpleVideoFilterTests
+//
+// Created by Janie Clayton-Hasz on 1/8/15.
+// Copyright (c) 2015 Red Queen Coder, LLC. All rights reserved.
+//
+
+#import
+#import
+
+@interface SimpleVideoFilterTests : XCTestCase
+
+@end
+
+@implementation SimpleVideoFilterTests
+
+- (void)setUp {
+ [super setUp];
+ // Put setup code here. This method is called before the invocation of each test method in the class.
+}
+
+- (void)tearDown {
+ // Put teardown code here. This method is called after the invocation of each test method in the class.
+ [super tearDown];
+}
+
+- (void)testExample {
+ // This is an example of a functional test case.
+ XCTAssert(YES, @"Pass");
+}
+
+- (void)testPerformanceExample {
+ // This is an example of a performance test case.
+ [self measureBlock:^{
+ // Put the code you want to measure the time of here.
+ }];
+}
+
+@end
diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.m b/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.m
deleted file mode 100644
index 906d1169a..000000000
--- a/examples/MultiViewFilterExample/MultiViewFilterExample/MultiViewViewController.m
+++ /dev/null
@@ -1,68 +0,0 @@
-#import "MultiViewViewController.h"
-
-@implementation MultiViewViewController
-
-- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
-{
- self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
- if (self) {
- }
- return self;
-}
-
-- (void)didReceiveMemoryWarning
-{
- [super didReceiveMemoryWarning];
-}
-
-#pragma mark - View lifecycle
-
-- (void)loadView
-{
- CGRect mainScreenFrame = [[UIScreen mainScreen] applicationFrame];
- UIView *primaryView = [[UIView alloc] initWithFrame:mainScreenFrame];
- primaryView.backgroundColor = [UIColor blueColor];
- self.view = primaryView;
-
- videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack];
-
- 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)];
- view2 = [[GPUImageView alloc] initWithFrame:CGRectMake(halfWidth, 0.0, halfWidth, halfHeight)];
- view3 = [[GPUImageView alloc] initWithFrame:CGRectMake(0.0, halfHeight, halfWidth, halfHeight)];
- view4 = [[GPUImageView alloc] initWithFrame:CGRectMake(halfWidth, halfHeight, halfWidth, halfHeight)];
- [self.view addSubview:view1];
- [self.view addSubview:view2];
- [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];
-
- [videoCamera addTarget:rotationFilter];
-
- [rotationFilter addTarget:view1];
- [rotationFilter addTarget:filter1];
- [filter1 addTarget:view2];
- [rotationFilter addTarget:filter2];
- [filter2 addTarget:view3];
- [rotationFilter addTarget:filter3];
- [filter3 addTarget:view4];
-
- [videoCamera startCameraCapture];
-}
-
-- (void)viewDidUnload
-{
- [super viewDidUnload];
-}
-
-- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
-{
- return (interfaceOrientation == UIInterfaceOrientationPortrait);
-}
-
-@end
diff --git a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m b/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m
deleted file mode 100644
index 29c29e9cf..000000000
--- a/examples/SimpleImageFilter/SimpleImageFilter/SimpleImageViewController.m
+++ /dev/null
@@ -1,100 +0,0 @@
-#import "SimpleImageViewController.h"
-
-@implementation SimpleImageViewController
-
-- (void)didReceiveMemoryWarning
-{
- [super didReceiveMemoryWarning];
- // Release any cached data, images, etc that aren't in use.
-}
-
-#pragma mark - View lifecycle
-
-- (void)loadView
-{
- CGRect mainScreenFrame = [[UIScreen mainScreen] applicationFrame];
- GPUImageView *primaryView = [[GPUImageView alloc] initWithFrame:mainScreenFrame];
- self.view = primaryView;
-
- [self setupDisplayFiltering];
- [self setupImageFilteringToDisk];
-}
-
-- (void)viewDidUnload
-{
- [super viewDidUnload];
- // Release any retained subviews of the main view.
- // e.g. self.myOutlet = nil;
-}
-
-- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
-{
- if (interfaceOrientation == UIInterfaceOrientationPortrait)
- {
- return YES;
- }
- return NO;
-}
-
-#pragma mark -
-#pragma mark Image filtering
-
-- (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];
-
- GPUImageView *imageView = (GPUImageView *)self.view;
-
- [sourcePicture addTarget:sepiaFilter];
- [sepiaFilter addTarget:imageView];
-
- [sourcePicture processImage];
-}
-
-- (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];
-// 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];
-// stillImageFilter.radius = 9;
-
- [stillImageSource addTarget:stillImageFilter];
- [stillImageSource processImage];
-
- UIImage *currentFilteredVideoFrame = [stillImageFilter 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 *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;
- }
-}
-
-@end
diff --git a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m b/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m
deleted file mode 100644
index 8bd664c74..000000000
--- a/examples/SimplePhotoFilter/SimplePhotoFilter/PhotoViewController.m
+++ /dev/null
@@ -1,104 +0,0 @@
-#import "PhotoViewController.h"
-
-@interface PhotoViewController ()
-
-@end
-
-@implementation PhotoViewController
-
-- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
-{
- self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
- if (self) {
- // Custom initialization
- }
- return self;
-}
-
-- (void)loadView
-{
- CGRect mainScreenFrame = [[UIScreen mainScreen] bounds];
-
- // Yes, I know I'm a caveman for doing all this by hand
- GPUImageView *primaryView = [[GPUImageView alloc] initWithFrame:mainScreenFrame];
- primaryView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
-
- filterSettingsSlider = [[UISlider alloc] initWithFrame:CGRectMake(25.0, mainScreenFrame.size.height - 50.0, mainScreenFrame.size.width - 50.0, 40.0)];
- [filterSettingsSlider addTarget:self action:@selector(updateSliderValue:) forControlEvents:UIControlEventValueChanged];
- filterSettingsSlider.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;
- filterSettingsSlider.minimumValue = 0.0;
- filterSettingsSlider.maximumValue = 0.3;
- filterSettingsSlider.value = 0.05;
-
- [primaryView addSubview:filterSettingsSlider];
-
- photoCaptureButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
- photoCaptureButton.frame = CGRectMake(round(mainScreenFrame.size.width / 2.0 - 150.0 / 2.0), mainScreenFrame.size.height - 90.0, 150.0, 40.0);
- [photoCaptureButton setTitle:@"Capture Photo" forState:UIControlStateNormal];
- photoCaptureButton.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;
- [photoCaptureButton addTarget:self action:@selector(takePhoto:) forControlEvents:UIControlEventTouchUpInside];
-
- [primaryView addSubview:photoCaptureButton];
-
- self.view = primaryView;
-}
-
-- (void)viewDidLoad
-{
- [super viewDidLoad];
- // Do any additional setup after loading the view.
-
- stillCamera = [[GPUImageStillCamera alloc] init];
- filter = [[GPUImagePixellateFilter alloc] init];
-// filter = [[GPUImageSketchFilter alloc] init];
- GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight];
-
- [stillCamera addTarget:rotationFilter];
- [rotationFilter addTarget:filter];
- GPUImageView *filterView = (GPUImageView *)self.view;
- [filter addTarget:filterView];
-
- [stillCamera startCameraCapture];
-}
-
-- (void)viewDidUnload
-{
- [super viewDidUnload];
- // Release any retained subviews of the main view.
-}
-
-- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
-{
- return (interfaceOrientation == UIInterfaceOrientationPortrait);
-}
-
-- (IBAction)updateSliderValue:(id)sender
-{
- [(GPUImagePixellateFilter *)filter setFractionalWidthOfAPixel:[(UISlider *)sender value]];
- // [(GPUImageSketchFilter *)filter setIntensity:1.0];
-}
-
-- (IBAction)takePhoto:(id)sender;
-{
- NSLog(@"Took photo");
-
- [filter removeTarget:(GPUImageView *)self.view];
-
- [stillCamera capturePhotoProcessedUpToFilter:filter withCompletionHandler:^(UIImage *processedImage, NSError *error){
- NSData *dataForPNGFile = UIImagePNGRepresentation(processedImage);
-
- 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])
- {
- return;
- }
-
-
- [filter addTarget:(GPUImageView *)self.view];
- }];
-}
-
-@end
diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m
deleted file mode 100644
index 9b3fddb10..000000000
--- a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.m
+++ /dev/null
@@ -1,70 +0,0 @@
-#import "SimpleVideoFileFilterViewController.h"
-
-@implementation SimpleVideoFileFilterViewController
-
-- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
-{
- self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
- if (self) {
- }
- return self;
-}
-
-- (void)didReceiveMemoryWarning
-{
- [super didReceiveMemoryWarning];
-}
-
-#pragma mark - View lifecycle
-
-- (void)viewDidLoad
-{
- [super viewDidLoad];
-
- NSURL *sampleURL = [[NSBundle mainBundle] URLForResource:@"sample_iPod" withExtension:@"m4v"];
-
- movieFile = [[GPUImageMovie alloc] initWithURL:sampleURL];
- pixellateFilter = [[GPUImagePixellateFilter alloc] init];
- GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight];
-
- [movieFile addTarget:rotationFilter];
- [rotationFilter addTarget:pixellateFilter];
- GPUImageView *filterView = (GPUImageView *)self.view;
- [pixellateFilter 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)];
- [pixellateFilter addTarget:movieWriter];
-
- [movieWriter startRecording];
- [movieFile startProcessing];
-
- 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];
- [movieWriter finishRecording];
- NSLog(@"Done recording");
- });
-}
-
-- (void)viewDidUnload
-{
- [super viewDidUnload];
-}
-
-- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
-{
- return (interfaceOrientation == UIInterfaceOrientationPortrait);
-}
-
-- (IBAction)updatePixelWidth:(id)sender
-{
- pixellateFilter.fractionalWidthOfAPixel = [(UISlider *)sender value];
-}
-
-@end
diff --git a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.xib b/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.xib
deleted file mode 100644
index 43a8d520d..000000000
--- a/examples/SimpleVideoFileFilter/SimpleVideoFileFilter/SimpleVideoFileFilterViewController.xib
+++ /dev/null
@@ -1,174 +0,0 @@
-
-
-
- 1280
- 11D50
- 2177
- 1138.32
- 568.00
-
- com.apple.InterfaceBuilder.IBCocoaTouchPlugin
- 1173
-
-
- IBProxyObject
- IBUIView
- IBUISlider
-
-
- com.apple.InterfaceBuilder.IBCocoaTouchPlugin
-
-
- PluginDependencyRecalculationVersion
-
-
-
-
- IBFilesOwner
- IBCocoaTouchFramework
-
-
- IBFirstResponder
- IBCocoaTouchFramework
-
-
-
- 274
-
-
-
- 266
- {{18, 418}, {284, 23}}
-
-
- _NS:623
- NO
- IBCocoaTouchFramework
- 0
- 0
- 0.10000000149011612
- 0.30000001192092896
-
-
- {{0, 20}, {320, 460}}
-
-
-
-
- 3
- MQA
-
- 2
-
-
-
- IBCocoaTouchFramework
-
-
-
-
-
-
- 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
-
-
-
-
-
- 5
-
-
-
-
- GPUImageView
- UIView
-
- IBProjectSource
- ./Classes/GPUImageView.h
-
-
-
- SimpleVideoFileFilterViewController
- UIViewController
-
- updatePixelWidth:
- id
-
-
- updatePixelWidth:
-
- updatePixelWidth:
- id
-
-
-
- IBProjectSource
- ./Classes/SimpleVideoFileFilterViewController.h
-
-
-
-
- 0
- IBCocoaTouchFramework
- YES
- 3
- 1173
-
-
diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m
deleted file mode 100644
index a7afce9ab..000000000
--- a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m
+++ /dev/null
@@ -1,73 +0,0 @@
-#import "SimpleVideoFilterViewController.h"
-
-@implementation SimpleVideoFilterViewController
-
-- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
-{
- self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
- if (self) {
- }
- return self;
-}
-
-- (void)didReceiveMemoryWarning
-{
- [super didReceiveMemoryWarning];
-}
-
-#pragma mark - View lifecycle
-
-- (void)viewDidLoad
-{
- [super 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];
- GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight];
-
- [videoCamera addTarget:rotationFilter];
- [rotationFilter addTarget:filter];
- GPUImageView *filterView = (GPUImageView *)self.view;
- [filter addTarget:filterView];
-
- // Record a movie for 10 s and store it in /Documents, visible via iTunes file sharing
-
- 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(720.0, 1280.0)];
-// movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(1080.0, 1920.0)];
- [filter addTarget:movieWriter];
-
- [movieWriter startRecording];
- [videoCamera startCameraCapture];
-
- double delayInSeconds = 20.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];
- });
-}
-
-- (void)viewDidUnload
-{
- [super viewDidUnload];
-}
-
-- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
-{
- return (interfaceOrientation == UIInterfaceOrientationPortrait);
-}
-
-- (IBAction)updateSliderValue:(id)sender
-{
- [(GPUImagePixellateFilter *)filter setFractionalWidthOfAPixel:[(UISlider *)sender value]];
-// [(GPUImageSketchFilter *)filter setIntensity:1.0];
-}
-
-@end
diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.xib b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.xib
deleted file mode 100644
index d2785904e..000000000
--- a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.xib
+++ /dev/null
@@ -1,174 +0,0 @@
-
-
-
- 1280
- 11D50
- 2177
- 1138.32
- 568.00
-
- com.apple.InterfaceBuilder.IBCocoaTouchPlugin
- 1173
-
-
- IBProxyObject
- IBUIView
- IBUISlider
-
-
- com.apple.InterfaceBuilder.IBCocoaTouchPlugin
-
-
- PluginDependencyRecalculationVersion
-
-
-
-
- IBFilesOwner
- IBCocoaTouchFramework
-
-
- IBFirstResponder
- IBCocoaTouchFramework
-
-
-
- 274
-
-
-
- 266
- {{18, 418}, {284, 23}}
-
-
- _NS:623
- NO
- IBCocoaTouchFramework
- 0
- 0
- 0.10000000149011612
- 0.30000001192092896
-
-
- {{0, 20}, {320, 460}}
-
-
-
-
- 3
- MQA
-
- 2
-
-
-
- IBCocoaTouchFramework
-
-
-
-
-
-
- view
-
-
-
- 3
-
-
-
- updateSliderValue:
-
-
- 13
-
- 6
-
-
-
-
-
- 0
-
-
-
-
-
- 1
-
-
-
-
-
-
-
- -1
-
-
- File's Owner
-
-
- -2
-
-
-
-
- 4
-
-
-
-
-
-
- SimpleVideoFilterViewController
- com.apple.InterfaceBuilder.IBCocoaTouchPlugin
- UIResponder
- com.apple.InterfaceBuilder.IBCocoaTouchPlugin
- GPUImageView
- com.apple.InterfaceBuilder.IBCocoaTouchPlugin
- com.apple.InterfaceBuilder.IBCocoaTouchPlugin
-
-
-
-
-
- 6
-
-
-
-
- GPUImageView
- UIView
-
- IBProjectSource
- ./Classes/GPUImageView.h
-
-
-
- SimpleVideoFilterViewController
- UIViewController
-
- updatePixelWidth:
- id
-
-
- updatePixelWidth:
-
- updatePixelWidth:
- id
-
-
-
- IBProjectSource
- ./Classes/SimpleVideoFilterViewController.h
-
-
-
-
- 0
- IBCocoaTouchFramework
- YES
- 3
- 1173
-
-
diff --git a/examples/BenchmarkSuite/BenchmarkSuite.xcodeproj/project.pbxproj b/examples/iOS/BenchmarkSuite/BenchmarkSuite.xcodeproj/project.pbxproj
old mode 100644
new mode 100755
similarity index 83%
rename from examples/BenchmarkSuite/BenchmarkSuite.xcodeproj/project.pbxproj
rename to examples/iOS/BenchmarkSuite/BenchmarkSuite.xcodeproj/project.pbxproj
index a24554c16..0baf183d3
--- a/examples/BenchmarkSuite/BenchmarkSuite.xcodeproj/project.pbxproj
+++ b/examples/iOS/BenchmarkSuite/BenchmarkSuite.xcodeproj/project.pbxproj
@@ -8,7 +8,13 @@
/* 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 */; };
+ 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 */; };
@@ -26,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 */; };
@@ -34,24 +39,25 @@
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 */
- 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;
@@ -62,6 +68,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; };
@@ -88,7 +99,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; };
@@ -96,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 */
@@ -103,6 +115,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 */,
@@ -110,7 +123,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 */,
@@ -120,9 +132,19 @@
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
+ BCF866D11725A2D800912E34 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ BCF866D71725A2D800912E34 /* libGPUImage.a */,
+ BCF866D91725A2D800912E34 /* GPUImageTests.octest */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
BCF9D14B14EAD24200986461 = {
isa = PBXGroup;
children = (
+ E5066F241855A55B008C7682 /* Default-568h@2x.png */,
BCF9D16014EAD24200986461 /* BenchmarkSuite */,
BCF9D15914EAD24200986461 /* Frameworks */,
BCF9D15714EAD24200986461 /* Products */,
@@ -178,6 +200,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 */,
@@ -193,15 +220,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 */
@@ -216,7 +234,7 @@
buildRules = (
);
dependencies = (
- BCF9D1D814EC4F4C00986461 /* PBXTargetDependency */,
+ BCF866DB1725A2E400912E34 /* PBXTargetDependency */,
);
name = BenchmarkSuite;
productName = BenchmarkSuite;
@@ -229,7 +247,7 @@
BCF9D14D14EAD24200986461 /* Project object */ = {
isa = PBXProject;
attributes = {
- LastUpgradeCheck = 0420;
+ LastUpgradeCheck = 0500;
ORGANIZATIONNAME = "Cell Phone";
};
buildConfigurationList = BCF9D15014EAD24200986461 /* Build configuration list for PBXProject "BenchmarkSuite" */;
@@ -244,7 +262,7 @@
projectDirPath = "";
projectReferences = (
{
- ProductGroup = BCF9D1CB14EC4F3F00986461 /* Products */;
+ ProductGroup = BCF866D11725A2D800912E34 /* Products */;
ProjectRef = BCF9D1CA14EC4F3F00986461 /* GPUImage.xcodeproj */;
},
);
@@ -256,18 +274,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 */
@@ -287,6 +305,12 @@
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 */,
+ E5066F251855A55B008C7682 /* Default-568h@2x.png in Resources */,
+ BCB3C3D516BCA4AD003D26B0 /* Icon@2x.png in Resources */,
+ BCB3C3D616BCA4AD003D26B0 /* iTunesArtwork.png in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -309,10 +333,10 @@
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
- BCF9D1D814EC4F4C00986461 /* PBXTargetDependency */ = {
+ BCF866DB1725A2E400912E34 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = GPUImage;
- targetProxy = BCF9D1D714EC4F4C00986461 /* PBXContainerItemProxy */;
+ targetProxy = BCF866DA1725A2E400912E34 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
@@ -332,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;
@@ -346,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/**";
+ HEADER_SEARCH_PATHS = "../../../framework/**";
IPHONEOS_DEPLOYMENT_TARGET = 5.0;
+ ONLY_ACTIVE_ARCH = YES;
OTHER_LDFLAGS = "-ObjC";
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
@@ -361,17 +395,26 @@
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/**";
+ HEADER_SEARCH_PATHS = "../../../framework/**";
IPHONEOS_DEPLOYMENT_TARGET = 5.0;
OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
OTHER_LDFLAGS = "-ObjC";
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/BenchmarkSuite/BenchmarkSuite/41-picture-frame.png b/examples/iOS/BenchmarkSuite/BenchmarkSuite/41-picture-frame.png
old mode 100644
new mode 100755
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
old mode 100644
new mode 100755
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
old mode 100644
new mode 100755
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
old mode 100644
new mode 100755
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
old mode 100644
new mode 100755
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
old mode 100644
new mode 100755
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
old mode 100644
new mode 100755
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
old mode 100644
new mode 100755
similarity index 98%
rename from examples/BenchmarkSuite/BenchmarkSuite/BenchmarkAppDelegate.m
rename to examples/iOS/BenchmarkSuite/BenchmarkSuite/BenchmarkAppDelegate.m
index b714fc6d6..3089d1db9
--- a/examples/BenchmarkSuite/BenchmarkSuite/BenchmarkAppDelegate.m
+++ b/examples/iOS/BenchmarkSuite/BenchmarkSuite/BenchmarkAppDelegate.m
@@ -33,8 +33,8 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(
mainTabBarController.viewControllers = arrayOfViewControllers;
mainTabBarController.selectedViewController = imageFilteringBenchmarkController;
- [self.window addSubview:mainTabBarController.view];
-
+ self.window.rootViewController = mainTabBarController;
+
[self.window makeKeyAndVisible];
return YES;
}
diff --git a/examples/BenchmarkSuite/BenchmarkSuite/BenchmarkSuite-Info.plist b/examples/iOS/BenchmarkSuite/BenchmarkSuite/BenchmarkSuite-Info.plist
old mode 100644
new mode 100755
similarity index 95%
rename from examples/BenchmarkSuite/BenchmarkSuite/BenchmarkSuite-Info.plist
rename to examples/iOS/BenchmarkSuite/BenchmarkSuite/BenchmarkSuite-Info.plist
index 6587ee3a1..7a0d5fcab
--- a/examples/BenchmarkSuite/BenchmarkSuite/BenchmarkSuite-Info.plist
+++ b/examples/iOS/BenchmarkSuite/BenchmarkSuite/BenchmarkSuite-Info.plist
@@ -26,7 +26,9 @@
1.0
LSRequiresIPhoneOS
- UIFileSharingEnabled
+ UIFileSharingEnabled
+
+ UIPrerenderedIcon
UIRequiredDeviceCapabilities
diff --git a/examples/BenchmarkSuite/BenchmarkSuite/BenchmarkSuite-Prefix.pch b/examples/iOS/BenchmarkSuite/BenchmarkSuite/BenchmarkSuite-Prefix.pch
old mode 100644
new mode 100755
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
old mode 100644
new mode 100755
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
old mode 100644
new mode 100755
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
old mode 100644
new mode 100755
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
old mode 100644
new mode 100755
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
old mode 100644
new mode 100755
similarity index 98%
rename from examples/BenchmarkSuite/BenchmarkSuite/ImageFilteringBenchmarkController.m
rename to examples/iOS/BenchmarkSuite/BenchmarkSuite/ImageFilteringBenchmarkController.m
index ae2ae930e..35e55bbac
--- a/examples/BenchmarkSuite/BenchmarkSuite/ImageFilteringBenchmarkController.m
+++ b/examples/iOS/BenchmarkSuite/BenchmarkSuite/ImageFilteringBenchmarkController.m
@@ -133,9 +133,10 @@ - (UIImage *)imageProcessedUsingGPUImage:(UIImage *)imageToProcess;
GPUImageSepiaFilter *stillImageFilter = [[GPUImageSepiaFilter alloc] init];
[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/BenchmarkSuite/BenchmarkSuite/VideoFilteringBenchmarkController.h b/examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringBenchmarkController.h
old mode 100644
new mode 100755
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
old mode 100644
new mode 100755
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
old mode 100644
new mode 100755
similarity index 93%
rename from examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.h
rename to examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.h
index e3962178d..5b641d011
--- a/examples/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/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m b/examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m
old mode 100644
new mode 100755
similarity index 78%
rename from examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m
rename to examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m
index b393cd0e0..34ed594ea
--- a/examples/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,16 +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];
- GPUImageRotationFilter *rotationFilter = [[GPUImageRotationFilter alloc] initWithRotation:kGPUImageRotateRight];
+// 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:rotationFilter];
- [rotationFilter addTarget:sepiaFilter];
+ [videoCamera addTarget:benchmarkedGPUImageFilter];
filterView = [[GPUImageView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:filterView];
- [sepiaFilter addTarget:filterView];
+ [benchmarkedGPUImageFilter addTarget:filterView];
[videoCamera startCameraCapture];
@@ -217,10 +236,9 @@ -(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);
+ size_t bufferHeight = CVPixelBufferGetHeight(pixelBuffer);
+ size_t bufferWidth = CVPixelBufferGetWidth(pixelBuffer);
NSInteger myDataLength = bufferWidth * bufferHeight * 4;
@@ -257,11 +275,15 @@ -(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];
- [coreImageContext drawImage:outputImage atPoint:CGPointMake(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);
+ 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];
elapsedTime = CFAbsoluteTimeGetCurrent() - startTime;
diff --git a/examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.xib b/examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.xib
old mode 100644
new mode 100755
similarity index 100%
rename from examples/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.xib
rename to examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.xib
diff --git a/examples/MultiViewFilterExample/MultiViewFilterExample/en.lproj/InfoPlist.strings b/examples/iOS/BenchmarkSuite/BenchmarkSuite/en.lproj/InfoPlist.strings
old mode 100644
new mode 100755
similarity index 100%
rename from examples/MultiViewFilterExample/MultiViewFilterExample/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
old mode 100644
new mode 100755
similarity index 100%
rename from examples/BenchmarkSuite/BenchmarkSuite/main.m
rename to examples/iOS/BenchmarkSuite/BenchmarkSuite/main.m
diff --git a/examples/iOS/BenchmarkSuite/Default-568h@2x.png b/examples/iOS/BenchmarkSuite/Default-568h@2x.png
new file mode 100644
index 000000000..0891b7aab
Binary files /dev/null and b/examples/iOS/BenchmarkSuite/Default-568h@2x.png differ
diff --git a/examples/BenchmarkSuite/GlyphishIconLicense.txt b/examples/iOS/BenchmarkSuite/GlyphishIconLicense.txt
old mode 100644
new mode 100755
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
old mode 100644
new mode 100755
similarity index 76%
rename from examples/ColorObjectTracking/ColorObjectTracking.xcodeproj/project.pbxproj
rename to examples/iOS/ColorObjectTracking/ColorObjectTracking.xcodeproj/project.pbxproj
index 98581b506..840541a78
--- a/examples/ColorObjectTracking/ColorObjectTracking.xcodeproj/project.pbxproj
+++ b/examples/iOS/ColorObjectTracking/ColorObjectTracking.xcodeproj/project.pbxproj
@@ -13,33 +13,39 @@
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 */; };
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 */; };
+ 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 */
- BC245E1114DDCA1F009FE7EB /* PBXContainerItemProxy */ = {
+ BC7E93CC19EB22EB006D23C3 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BC245E0C14DDCA1F009FE7EB /* GPUImage.xcodeproj */;
proxyType = 2;
- remoteGlobalIDString = BCF1A33414DDB1EC00852800;
- remoteInfo = GPUImage;
+ remoteGlobalIDString = BCE209E51943F20C002FEED8;
+ remoteInfo = GPUImageFramework;
};
- BC245E1314DDCA1F009FE7EB /* PBXContainerItemProxy */ = {
+ BCF866E31725A38C00912E34 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BC245E0C14DDCA1F009FE7EB /* GPUImage.xcodeproj */;
proxyType = 2;
- remoteGlobalIDString = BCF1A34414DDB1EC00852800;
- remoteInfo = GPUImageTests;
+ remoteGlobalIDString = BCF1A33414DDB1EC00852800;
+ remoteInfo = GPUImage;
};
- BCB5E73F14DDCCA600701302 /* PBXContainerItemProxy */ = {
+ BCF866E71725A39800912E34 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BC245E0C14DDCA1F009FE7EB /* GPUImage.xcodeproj */;
proxyType = 1;
@@ -59,7 +65,12 @@
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 = ""; };
+ 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 = ""; };
@@ -69,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 */
@@ -76,6 +88,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 */,
@@ -84,7 +97,6 @@
BC245DDF14DDC959009FE7EB /* UIKit.framework in Frameworks */,
BC245DE114DDC959009FE7EB /* Foundation.framework in Frameworks */,
BC245DE314DDC959009FE7EB /* CoreGraphics.framework in Frameworks */,
- BCB5E7A414E346CE00701302 /* libGPUImage.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -94,6 +106,7 @@
BC245DCF14DDC959009FE7EB = {
isa = PBXGroup;
children = (
+ E5066F291855A595008C7682 /* Default-568h@2x.png */,
BC245DE414DDC959009FE7EB /* ColorObjectTracking */,
BC245DDD14DDC959009FE7EB /* Frameworks */,
BC245DDB14DDC959009FE7EB /* Products */,
@@ -140,6 +153,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 */,
@@ -148,22 +166,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 */,
+ BC7E93CD19EB22EB006D23C3 /* GPUImage.framework */,
);
- name = Shaders;
+ name = Products;
sourceTree = "