Repository: BradLarson/GPUImage
Branch: master
Commit: 167b0389bc6e
Files: 616
Total size: 3.4 MB
Directory structure:
gitextract_fkk0nnpa/
├── .gitignore
├── .travis.yml
├── GPUImage.podspec
├── License.txt
├── README.md
├── build.sh
├── examples/
│ ├── Mac/
│ │ ├── FilterShowcase/
│ │ │ ├── FilterShowcase/
│ │ │ │ ├── FilterShowcase-Info.plist
│ │ │ │ ├── FilterShowcase-Prefix.pch
│ │ │ │ ├── SLSAppDelegate.h
│ │ │ │ ├── SLSAppDelegate.m
│ │ │ │ ├── en.lproj/
│ │ │ │ │ ├── Credits.rtf
│ │ │ │ │ ├── InfoPlist.strings
│ │ │ │ │ └── MainMenu.xib
│ │ │ │ └── main.m
│ │ │ ├── FilterShowcase.xcodeproj/
│ │ │ │ ├── project.pbxproj
│ │ │ │ └── xcshareddata/
│ │ │ │ └── xcschemes/
│ │ │ │ └── FilterShowcase.xcscheme
│ │ │ ├── SLSFilterShowcaseWindowController.h
│ │ │ ├── SLSFilterShowcaseWindowController.m
│ │ │ └── SLSFilterShowcaseWindowController.xib
│ │ ├── FilterShowcaseSwift/
│ │ │ ├── FilterShowcaseSwift/
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Base.lproj/
│ │ │ │ │ └── MainMenu.xib
│ │ │ │ ├── FilterShowcaseWindowController.swift
│ │ │ │ ├── FilterShowcaseWindowController.xib
│ │ │ │ ├── Images.xcassets/
│ │ │ │ │ └── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Info.plist
│ │ │ │ └── main.swift
│ │ │ ├── FilterShowcaseSwift.xcodeproj/
│ │ │ │ └── project.pbxproj
│ │ │ └── FilterShowcaseSwiftTests/
│ │ │ ├── FilterShowcaseSwiftTests.swift
│ │ │ └── Info.plist
│ │ ├── MultiViewFilterExample/
│ │ │ ├── MultiViewFilterExample/
│ │ │ │ ├── MultiViewFilterExample-Info.plist
│ │ │ │ ├── MultiViewFilterExample-Prefix.pch
│ │ │ │ ├── SLSAppDelegate.h
│ │ │ │ ├── SLSAppDelegate.m
│ │ │ │ ├── SLSMultiViewWindowController.h
│ │ │ │ ├── SLSMultiViewWindowController.m
│ │ │ │ ├── SLSMultiViewWindowController.xib
│ │ │ │ ├── Shader1.fsh
│ │ │ │ ├── Shader2.fsh
│ │ │ │ ├── en.lproj/
│ │ │ │ │ ├── Credits.rtf
│ │ │ │ │ ├── InfoPlist.strings
│ │ │ │ │ └── MainMenu.xib
│ │ │ │ └── main.m
│ │ │ └── MultiViewFilterExample.xcodeproj/
│ │ │ ├── project.pbxproj
│ │ │ └── xcshareddata/
│ │ │ └── xcschemes/
│ │ │ └── MultiViewFilterExample.xcscheme
│ │ ├── PlaygroundExample/
│ │ │ ├── PlaygroundExample/
│ │ │ │ ├── GPUImagePlayground.playground/
│ │ │ │ │ ├── Resources/
│ │ │ │ │ │ └── CustomFilter.fsh
│ │ │ │ │ ├── contents.xcplayground
│ │ │ │ │ ├── section-1.swift
│ │ │ │ │ └── timeline.xctimeline
│ │ │ │ └── main.swift
│ │ │ └── PlaygroundExample.xcodeproj/
│ │ │ └── project.pbxproj
│ │ ├── ShaderDesigner/
│ │ │ ├── ShaderDesigner/
│ │ │ │ ├── AppDelegate.h
│ │ │ │ ├── AppDelegate.m
│ │ │ │ ├── Base.lproj/
│ │ │ │ │ └── MainMenu.xib
│ │ │ │ ├── Images.xcassets/
│ │ │ │ │ └── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Info.plist
│ │ │ │ ├── ShaderDesignerWindowController.h
│ │ │ │ ├── ShaderDesignerWindowController.m
│ │ │ │ ├── ShaderDesignerWindowController.xib
│ │ │ │ └── main.m
│ │ │ └── ShaderDesigner.xcodeproj/
│ │ │ └── project.pbxproj
│ │ ├── SimplePhotoFilter/
│ │ │ ├── SimplePhotoFilter/
│ │ │ │ ├── SLSDocument.h
│ │ │ │ ├── SLSDocument.m
│ │ │ │ ├── SimplePhotoFilter-Info.plist
│ │ │ │ ├── SimplePhotoFilter-Prefix.pch
│ │ │ │ ├── en.lproj/
│ │ │ │ │ ├── Credits.rtf
│ │ │ │ │ ├── InfoPlist.strings
│ │ │ │ │ ├── MainMenu.xib
│ │ │ │ │ └── SLSDocument.xib
│ │ │ │ └── main.m
│ │ │ └── SimplePhotoFilter.xcodeproj/
│ │ │ ├── project.pbxproj
│ │ │ └── xcshareddata/
│ │ │ └── xcschemes/
│ │ │ └── SimplePhotoFilter.xcscheme
│ │ ├── SimpleVideoFileFilter/
│ │ │ ├── SimpleVideoFileFilter.xcodeproj/
│ │ │ │ └── project.pbxproj
│ │ │ ├── SimpleVideoFilter/
│ │ │ │ ├── AppDelegate.h
│ │ │ │ ├── AppDelegate.m
│ │ │ │ ├── Base.lproj/
│ │ │ │ │ └── MainMenu.xib
│ │ │ │ ├── Images.xcassets/
│ │ │ │ │ └── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Info.plist
│ │ │ │ ├── SLSSimpleVideoFileFilterWindowController.h
│ │ │ │ ├── SLSSimpleVideoFileFilterWindowController.m
│ │ │ │ ├── SLSSimpleVideoFileFilterWindowController.xib
│ │ │ │ ├── main.m
│ │ │ │ └── sample_iPod.m4v
│ │ │ └── SimpleVideoFilterTests/
│ │ │ ├── Info.plist
│ │ │ └── SimpleVideoFilterTests.m
│ │ └── SimpleVideoFilter/
│ │ ├── SimpleVideoFilter/
│ │ │ ├── AppDelegate.h
│ │ │ ├── AppDelegate.m
│ │ │ ├── Base.lproj/
│ │ │ │ └── MainMenu.xib
│ │ │ ├── Images.xcassets/
│ │ │ │ └── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ ├── Info.plist
│ │ │ ├── SLSSimpleVideoFilterWindowController.h
│ │ │ ├── SLSSimpleVideoFilterWindowController.m
│ │ │ ├── SLSSimpleVideoFilterWindowController.xib
│ │ │ └── main.m
│ │ ├── SimpleVideoFilter.xcodeproj/
│ │ │ └── project.pbxproj
│ │ └── SimpleVideoFilterTests/
│ │ ├── Info.plist
│ │ └── SimpleVideoFilterTests.m
│ └── iOS/
│ ├── BenchmarkSuite/
│ │ ├── BenchmarkSuite/
│ │ │ ├── BenchmarkAppDelegate.h
│ │ │ ├── BenchmarkAppDelegate.m
│ │ │ ├── BenchmarkSuite-Info.plist
│ │ │ ├── BenchmarkSuite-Prefix.pch
│ │ │ ├── BenchmarkTableViewController.h
│ │ │ ├── BenchmarkTableViewController.m
│ │ │ ├── BenchmarkTableViewController.xib
│ │ │ ├── ImageFilteringBenchmarkController.h
│ │ │ ├── ImageFilteringBenchmarkController.m
│ │ │ ├── VideoFilteringBenchmarkController.h
│ │ │ ├── VideoFilteringBenchmarkController.m
│ │ │ ├── VideoFilteringDisplayController.h
│ │ │ ├── VideoFilteringDisplayController.m
│ │ │ ├── VideoFilteringDisplayController.xib
│ │ │ ├── en.lproj/
│ │ │ │ └── InfoPlist.strings
│ │ │ └── main.m
│ │ ├── BenchmarkSuite.xcodeproj/
│ │ │ ├── project.pbxproj
│ │ │ └── xcshareddata/
│ │ │ └── xcschemes/
│ │ │ └── BenchmarkSuite.xcscheme
│ │ └── GlyphishIconLicense.txt
│ ├── ColorObjectTracking/
│ │ ├── ColorObjectTracking/
│ │ │ ├── ColorObjectTracking-Info.plist
│ │ │ ├── ColorObjectTracking-Prefix.pch
│ │ │ ├── ColorTrackingAppDelegate.h
│ │ │ ├── ColorTrackingAppDelegate.m
│ │ │ ├── ColorTrackingViewController.h
│ │ │ ├── ColorTrackingViewController.m
│ │ │ ├── PositionColor.fsh
│ │ │ ├── Threshold.fsh
│ │ │ ├── en.lproj/
│ │ │ │ └── InfoPlist.strings
│ │ │ └── main.m
│ │ └── ColorObjectTracking.xcodeproj/
│ │ ├── project.pbxproj
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ └── ColorObjectTracking.xcscheme
│ ├── CubeExample/
│ │ ├── Classes/
│ │ │ ├── CubeExampleAppDelegate.h
│ │ │ ├── CubeExampleAppDelegate.m
│ │ │ ├── DisplayViewController.h
│ │ │ ├── DisplayViewController.m
│ │ │ ├── ES2Renderer.h
│ │ │ ├── ES2Renderer.m
│ │ │ └── ESRenderer.h
│ │ ├── CubeExample-Info.plist
│ │ ├── CubeExample.xcodeproj/
│ │ │ ├── project.pbxproj
│ │ │ └── xcshareddata/
│ │ │ └── xcschemes/
│ │ │ └── CubeExample.xcscheme
│ │ ├── CubeExample_Prefix.pch
│ │ ├── Shaders/
│ │ │ ├── Shader.fsh
│ │ │ └── Shader.vsh
│ │ └── main.m
│ ├── FeatureExtractionTest/
│ │ ├── FeatureExtractionTest/
│ │ │ ├── FeatureExtractionAppDelegate.h
│ │ │ ├── FeatureExtractionAppDelegate.m
│ │ │ ├── FeatureExtractionTest-Info.plist
│ │ │ ├── FeatureExtractionTest-Prefix.pch
│ │ │ ├── en.lproj/
│ │ │ │ └── InfoPlist.strings
│ │ │ └── main.m
│ │ └── FeatureExtractionTest.xcodeproj/
│ │ ├── project.pbxproj
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ └── FeatureExtractionTest.xcscheme
│ ├── FilterShowcase/
│ │ ├── FilterShowcase/
│ │ │ ├── CustomFilter.fsh
│ │ │ ├── FilterShowcase-Info.plist
│ │ │ ├── FilterShowcase-Prefix.pch
│ │ │ ├── SampleConfiguration.plist
│ │ │ ├── ShowcaseAppDelegate.h
│ │ │ ├── ShowcaseAppDelegate.m
│ │ │ ├── ShowcaseFilterListController.h
│ │ │ ├── ShowcaseFilterListController.m
│ │ │ ├── ShowcaseFilterViewController.h
│ │ │ ├── ShowcaseFilterViewController.m
│ │ │ ├── ShowcaseFilterViewController.xib
│ │ │ ├── en.lproj/
│ │ │ │ └── InfoPlist.strings
│ │ │ └── main.m
│ │ └── FilterShowcase.xcodeproj/
│ │ ├── project.pbxproj
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ └── FilterShowcase.xcscheme
│ ├── FilterShowcaseSwift/
│ │ ├── FilterShowcaseSwift/
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Base.lproj/
│ │ │ │ └── Main.storyboard
│ │ │ ├── FilterDisplayViewController.swift
│ │ │ ├── FilterListViewController.swift
│ │ │ ├── FilterOperationTypes.swift
│ │ │ ├── FilterOperations.swift
│ │ │ ├── Images.xcassets/
│ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── LaunchImage.launchimage/
│ │ │ │ └── Contents.json
│ │ │ └── Info.plist
│ │ └── FilterShowcaseSwift.xcodeproj/
│ │ └── project.pbxproj
│ ├── MultiViewFilterExample/
│ │ ├── MultiViewFilterExample/
│ │ │ ├── MultiViewAppDelegate.h
│ │ │ ├── MultiViewAppDelegate.m
│ │ │ ├── MultiViewFilterExample-Info.plist
│ │ │ ├── MultiViewFilterExample-Prefix.pch
│ │ │ ├── MultiViewViewController.h
│ │ │ ├── MultiViewViewController.m
│ │ │ ├── Shader1.fsh
│ │ │ ├── Shader2.fsh
│ │ │ ├── en.lproj/
│ │ │ │ └── InfoPlist.strings
│ │ │ └── main.m
│ │ └── MultiViewFilterExample.xcodeproj/
│ │ ├── project.pbxproj
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ └── MultiViewFilterExample.xcscheme
│ ├── RawDataTest/
│ │ ├── RawDataTest/
│ │ │ ├── CalculationShader.fsh
│ │ │ ├── RawDataTest-Info.plist
│ │ │ ├── RawDataTest-Prefix.pch
│ │ │ ├── RawDataTestAppDelegate.h
│ │ │ ├── RawDataTestAppDelegate.m
│ │ │ ├── en.lproj/
│ │ │ │ └── InfoPlist.strings
│ │ │ └── main.m
│ │ └── RawDataTest.xcodeproj/
│ │ ├── project.pbxproj
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ └── RawDataTest.xcscheme
│ ├── SimpleImageFilter/
│ │ ├── SimpleImageFilter/
│ │ │ ├── SimpleImageAppDelegate.h
│ │ │ ├── SimpleImageAppDelegate.m
│ │ │ ├── SimpleImageFilter-Info.plist
│ │ │ ├── SimpleImageFilter-Prefix.pch
│ │ │ ├── SimpleImageViewController.h
│ │ │ ├── SimpleImageViewController.m
│ │ │ ├── en.lproj/
│ │ │ │ └── InfoPlist.strings
│ │ │ └── main.m
│ │ └── SimpleImageFilter.xcodeproj/
│ │ ├── project.pbxproj
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ └── SimpleImageFilter.xcscheme
│ ├── SimplePhotoFilter/
│ │ ├── SimplePhotoFilter/
│ │ │ ├── PhotoAppDelegate.h
│ │ │ ├── PhotoAppDelegate.m
│ │ │ ├── PhotoViewController.h
│ │ │ ├── PhotoViewController.m
│ │ │ ├── SimplePhotoFilter-Info.plist
│ │ │ ├── SimplePhotoFilter-Prefix.pch
│ │ │ ├── en.lproj/
│ │ │ │ └── InfoPlist.strings
│ │ │ └── main.m
│ │ └── SimplePhotoFilter.xcodeproj/
│ │ ├── project.pbxproj
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ └── SimplePhotoFilter.xcscheme
│ ├── SimpleSwiftVideoFilterExample/
│ │ ├── SimpleSwiftVideoFilterExample/
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Base.lproj/
│ │ │ │ └── Main.storyboard
│ │ │ ├── Images.xcassets/
│ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── LaunchImage.launchimage/
│ │ │ │ └── Contents.json
│ │ │ ├── Info.plist
│ │ │ └── ViewController.swift
│ │ └── SimpleSwiftVideoFilterExample.xcodeproj/
│ │ └── project.pbxproj
│ ├── SimpleVideoFileFilter/
│ │ ├── SimpleVideoFileFilter/
│ │ │ ├── SimpleVideoFileFilter-Info.plist
│ │ │ ├── SimpleVideoFileFilter-Prefix.pch
│ │ │ ├── SimpleVideoFileFilterAppDelegate.h
│ │ │ ├── SimpleVideoFileFilterAppDelegate.m
│ │ │ ├── SimpleVideoFileFilterViewController.h
│ │ │ ├── SimpleVideoFileFilterViewController.m
│ │ │ ├── SimpleVideoFileFilterViewController.xib
│ │ │ ├── en.lproj/
│ │ │ │ └── InfoPlist.strings
│ │ │ ├── main.m
│ │ │ └── sample_iPod.m4v
│ │ └── SimpleVideoFileFilter.xcodeproj/
│ │ ├── project.pbxproj
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ └── SimpleVideoFileFilter.xcscheme
│ └── SimpleVideoFilter/
│ ├── SimpleVideoFilter/
│ │ ├── SimpleVideoFilter-Info.plist
│ │ ├── SimpleVideoFilter-Prefix.pch
│ │ ├── SimpleVideoFilterAppDelegate.h
│ │ ├── SimpleVideoFilterAppDelegate.m
│ │ ├── SimpleVideoFilterViewController.h
│ │ ├── SimpleVideoFilterViewController.m
│ │ ├── SimpleVideoFilterViewController.xib
│ │ ├── en.lproj/
│ │ │ └── InfoPlist.strings
│ │ └── main.m
│ └── SimpleVideoFilter.xcodeproj/
│ ├── project.pbxproj
│ └── xcshareddata/
│ └── xcschemes/
│ └── SimpleVideoFilter.xcscheme
└── framework/
├── GPUImage.xcodeproj/
│ ├── project.pbxproj
│ └── xcshareddata/
│ └── xcschemes/
│ ├── Documentation.xcscheme
│ ├── GPUImage.xcscheme
│ └── GPUImageFramework.xcscheme
├── GPUImageMac.xcodeproj/
│ ├── project.pbxproj
│ └── xcshareddata/
│ └── xcschemes/
│ └── GPUImage.xcscheme
└── Source/
├── GLProgram.h
├── GLProgram.m
├── GPUImage.h
├── GPUImage3x3ConvolutionFilter.h
├── GPUImage3x3ConvolutionFilter.m
├── GPUImage3x3TextureSamplingFilter.h
├── GPUImage3x3TextureSamplingFilter.m
├── GPUImageAdaptiveThresholdFilter.h
├── GPUImageAdaptiveThresholdFilter.m
├── GPUImageAddBlendFilter.h
├── GPUImageAddBlendFilter.m
├── GPUImageAlphaBlendFilter.h
├── GPUImageAlphaBlendFilter.m
├── GPUImageAmatorkaFilter.h
├── GPUImageAmatorkaFilter.m
├── GPUImageAverageColor.h
├── GPUImageAverageColor.m
├── GPUImageAverageLuminanceThresholdFilter.h
├── GPUImageAverageLuminanceThresholdFilter.m
├── GPUImageBilateralFilter.h
├── GPUImageBilateralFilter.m
├── GPUImageBoxBlurFilter.h
├── GPUImageBoxBlurFilter.m
├── GPUImageBrightnessFilter.h
├── GPUImageBrightnessFilter.m
├── GPUImageBuffer.h
├── GPUImageBuffer.m
├── GPUImageBulgeDistortionFilter.h
├── GPUImageBulgeDistortionFilter.m
├── GPUImageCGAColorspaceFilter.h
├── GPUImageCGAColorspaceFilter.m
├── GPUImageCannyEdgeDetectionFilter.h
├── GPUImageCannyEdgeDetectionFilter.m
├── GPUImageChromaKeyBlendFilter.h
├── GPUImageChromaKeyBlendFilter.m
├── GPUImageChromaKeyFilter.h
├── GPUImageChromaKeyFilter.m
├── GPUImageClosingFilter.h
├── GPUImageClosingFilter.m
├── GPUImageColorBlendFilter.h
├── GPUImageColorBlendFilter.m
├── GPUImageColorBurnBlendFilter.h
├── GPUImageColorBurnBlendFilter.m
├── GPUImageColorConversion.h
├── GPUImageColorConversion.m
├── GPUImageColorDodgeBlendFilter.h
├── GPUImageColorDodgeBlendFilter.m
├── GPUImageColorInvertFilter.h
├── GPUImageColorInvertFilter.m
├── GPUImageColorLocalBinaryPatternFilter.h
├── GPUImageColorLocalBinaryPatternFilter.m
├── GPUImageColorMatrixFilter.h
├── GPUImageColorMatrixFilter.m
├── GPUImageColorPackingFilter.h
├── GPUImageColorPackingFilter.m
├── GPUImageColourFASTFeatureDetector.h
├── GPUImageColourFASTFeatureDetector.m
├── GPUImageColourFASTSamplingOperation.h
├── GPUImageColourFASTSamplingOperation.m
├── GPUImageContrastFilter.h
├── GPUImageContrastFilter.m
├── GPUImageCropFilter.h
├── GPUImageCropFilter.m
├── GPUImageCrosshairGenerator.h
├── GPUImageCrosshairGenerator.m
├── GPUImageCrosshatchFilter.h
├── GPUImageCrosshatchFilter.m
├── GPUImageDarkenBlendFilter.h
├── GPUImageDarkenBlendFilter.m
├── GPUImageDifferenceBlendFilter.h
├── GPUImageDifferenceBlendFilter.m
├── GPUImageDilationFilter.h
├── GPUImageDilationFilter.m
├── GPUImageDirectionalNonMaximumSuppressionFilter.h
├── GPUImageDirectionalNonMaximumSuppressionFilter.m
├── GPUImageDirectionalSobelEdgeDetectionFilter.h
├── GPUImageDirectionalSobelEdgeDetectionFilter.m
├── GPUImageDissolveBlendFilter.h
├── GPUImageDissolveBlendFilter.m
├── GPUImageDivideBlendFilter.h
├── GPUImageDivideBlendFilter.m
├── GPUImageEmbossFilter.h
├── GPUImageEmbossFilter.m
├── GPUImageErosionFilter.h
├── GPUImageErosionFilter.m
├── GPUImageExclusionBlendFilter.h
├── GPUImageExclusionBlendFilter.m
├── GPUImageExposureFilter.h
├── GPUImageExposureFilter.m
├── GPUImageFASTCornerDetectionFilter.h
├── GPUImageFASTCornerDetectionFilter.m
├── GPUImageFalseColorFilter.h
├── GPUImageFalseColorFilter.m
├── GPUImageFilter.h
├── GPUImageFilter.m
├── GPUImageFilterGroup.h
├── GPUImageFilterGroup.m
├── GPUImageFilterPipeline.h
├── GPUImageFilterPipeline.m
├── GPUImageFourInputFilter.h
├── GPUImageFourInputFilter.m
├── GPUImageFramebuffer.h
├── GPUImageFramebuffer.m
├── GPUImageFramebufferCache.h
├── GPUImageFramebufferCache.m
├── GPUImageGammaFilter.h
├── GPUImageGammaFilter.m
├── GPUImageGaussianBlurFilter.h
├── GPUImageGaussianBlurFilter.m
├── GPUImageGaussianBlurPositionFilter.h
├── GPUImageGaussianBlurPositionFilter.m
├── GPUImageGaussianSelectiveBlurFilter.h
├── GPUImageGaussianSelectiveBlurFilter.m
├── GPUImageGlassSphereFilter.h
├── GPUImageGlassSphereFilter.m
├── GPUImageGrayscaleFilter.h
├── GPUImageGrayscaleFilter.m
├── GPUImageHSBFilter.h
├── GPUImageHSBFilter.m
├── GPUImageHalftoneFilter.h
├── GPUImageHalftoneFilter.m
├── GPUImageHardLightBlendFilter.h
├── GPUImageHardLightBlendFilter.m
├── GPUImageHarrisCornerDetectionFilter.h
├── GPUImageHarrisCornerDetectionFilter.m
├── GPUImageHazeFilter.h
├── GPUImageHazeFilter.m
├── GPUImageHighPassFilter.h
├── GPUImageHighPassFilter.m
├── GPUImageHighlightShadowFilter.h
├── GPUImageHighlightShadowFilter.m
├── GPUImageHighlightShadowTintFilter.h
├── GPUImageHighlightShadowTintFilter.m
├── GPUImageHistogramEqualizationFilter.h
├── GPUImageHistogramEqualizationFilter.m
├── GPUImageHistogramFilter.h
├── GPUImageHistogramFilter.m
├── GPUImageHistogramGenerator.h
├── GPUImageHistogramGenerator.m
├── GPUImageHoughTransformLineDetector.h
├── GPUImageHoughTransformLineDetector.m
├── GPUImageHueBlendFilter.h
├── GPUImageHueBlendFilter.m
├── GPUImageHueFilter.h
├── GPUImageHueFilter.m
├── GPUImageJFAVoronoiFilter.h
├── GPUImageJFAVoronoiFilter.m
├── GPUImageKuwaharaFilter.h
├── GPUImageKuwaharaFilter.m
├── GPUImageKuwaharaRadius3Filter.h
├── GPUImageKuwaharaRadius3Filter.m
├── GPUImageLanczosResamplingFilter.h
├── GPUImageLanczosResamplingFilter.m
├── GPUImageLaplacianFilter.h
├── GPUImageLaplacianFilter.m
├── GPUImageLevelsFilter.h
├── GPUImageLevelsFilter.m
├── GPUImageLightenBlendFilter.h
├── GPUImageLightenBlendFilter.m
├── GPUImageLineGenerator.h
├── GPUImageLineGenerator.m
├── GPUImageLinearBurnBlendFilter.h
├── GPUImageLinearBurnBlendFilter.m
├── GPUImageLocalBinaryPatternFilter.h
├── GPUImageLocalBinaryPatternFilter.m
├── GPUImageLookupFilter.h
├── GPUImageLookupFilter.m
├── GPUImageLowPassFilter.h
├── GPUImageLowPassFilter.m
├── GPUImageLuminanceRangeFilter.h
├── GPUImageLuminanceRangeFilter.m
├── GPUImageLuminanceThresholdFilter.h
├── GPUImageLuminanceThresholdFilter.m
├── GPUImageLuminosity.h
├── GPUImageLuminosity.m
├── GPUImageLuminosityBlendFilter.h
├── GPUImageLuminosityBlendFilter.m
├── GPUImageMaskFilter.h
├── GPUImageMaskFilter.m
├── GPUImageMedianFilter.h
├── GPUImageMedianFilter.m
├── GPUImageMissEtikateFilter.h
├── GPUImageMissEtikateFilter.m
├── GPUImageMonochromeFilter.h
├── GPUImageMonochromeFilter.m
├── GPUImageMosaicFilter.h
├── GPUImageMosaicFilter.m
├── GPUImageMotionBlurFilter.h
├── GPUImageMotionBlurFilter.m
├── GPUImageMotionDetector.h
├── GPUImageMotionDetector.m
├── GPUImageMovie.h
├── GPUImageMovie.m
├── GPUImageMovieComposition.h
├── GPUImageMovieComposition.m
├── GPUImageMultiplyBlendFilter.h
├── GPUImageMultiplyBlendFilter.m
├── GPUImageNobleCornerDetectionFilter.h
├── GPUImageNobleCornerDetectionFilter.m
├── GPUImageNonMaximumSuppressionFilter.h
├── GPUImageNonMaximumSuppressionFilter.m
├── GPUImageNormalBlendFilter.h
├── GPUImageNormalBlendFilter.m
├── GPUImageOpacityFilter.h
├── GPUImageOpacityFilter.m
├── GPUImageOpeningFilter.h
├── GPUImageOpeningFilter.m
├── GPUImageOutput.h
├── GPUImageOutput.m
├── GPUImageOverlayBlendFilter.h
├── GPUImageOverlayBlendFilter.m
├── GPUImageParallelCoordinateLineTransformFilter.h
├── GPUImageParallelCoordinateLineTransformFilter.m
├── GPUImagePerlinNoiseFilter.h
├── GPUImagePerlinNoiseFilter.m
├── GPUImagePinchDistortionFilter.h
├── GPUImagePinchDistortionFilter.m
├── GPUImagePixellateFilter.h
├── GPUImagePixellateFilter.m
├── GPUImagePixellatePositionFilter.h
├── GPUImagePixellatePositionFilter.m
├── GPUImagePoissonBlendFilter.h
├── GPUImagePoissonBlendFilter.m
├── GPUImagePolarPixellateFilter.h
├── GPUImagePolarPixellateFilter.m
├── GPUImagePolkaDotFilter.h
├── GPUImagePolkaDotFilter.m
├── GPUImagePosterizeFilter.h
├── GPUImagePosterizeFilter.m
├── GPUImagePrewittEdgeDetectionFilter.h
├── GPUImagePrewittEdgeDetectionFilter.m
├── GPUImageRGBClosingFilter.h
├── GPUImageRGBClosingFilter.m
├── GPUImageRGBDilationFilter.h
├── GPUImageRGBDilationFilter.m
├── GPUImageRGBErosionFilter.h
├── GPUImageRGBErosionFilter.m
├── GPUImageRGBFilter.h
├── GPUImageRGBFilter.m
├── GPUImageRGBOpeningFilter.h
├── GPUImageRGBOpeningFilter.m
├── GPUImageRawDataInput.h
├── GPUImageRawDataInput.m
├── GPUImageRawDataOutput.h
├── GPUImageRawDataOutput.m
├── GPUImageSaturationBlendFilter.h
├── GPUImageSaturationBlendFilter.m
├── GPUImageSaturationFilter.h
├── GPUImageSaturationFilter.m
├── GPUImageScreenBlendFilter.h
├── GPUImageScreenBlendFilter.m
├── GPUImageSepiaFilter.h
├── GPUImageSepiaFilter.m
├── GPUImageSharpenFilter.h
├── GPUImageSharpenFilter.m
├── GPUImageShiTomasiFeatureDetectionFilter.h
├── GPUImageShiTomasiFeatureDetectionFilter.m
├── GPUImageSingleComponentGaussianBlurFilter.h
├── GPUImageSingleComponentGaussianBlurFilter.m
├── GPUImageSketchFilter.h
├── GPUImageSketchFilter.m
├── GPUImageSkinToneFilter.h
├── GPUImageSkinToneFilter.m
├── GPUImageSmoothToonFilter.h
├── GPUImageSmoothToonFilter.m
├── GPUImageSobelEdgeDetectionFilter.h
├── GPUImageSobelEdgeDetectionFilter.m
├── GPUImageSoftEleganceFilter.h
├── GPUImageSoftEleganceFilter.m
├── GPUImageSoftLightBlendFilter.h
├── GPUImageSoftLightBlendFilter.m
├── GPUImageSolarizeFilter.h
├── GPUImageSolarizeFilter.m
├── GPUImageSolidColorGenerator.h
├── GPUImageSolidColorGenerator.m
├── GPUImageSourceOverBlendFilter.h
├── GPUImageSourceOverBlendFilter.m
├── GPUImageSphereRefractionFilter.h
├── GPUImageSphereRefractionFilter.m
├── GPUImageStillCamera.h
├── GPUImageStillCamera.m
├── GPUImageStretchDistortionFilter.h
├── GPUImageStretchDistortionFilter.m
├── GPUImageSubtractBlendFilter.h
├── GPUImageSubtractBlendFilter.m
├── GPUImageSwirlFilter.h
├── GPUImageSwirlFilter.m
├── GPUImageTextureInput.h
├── GPUImageTextureInput.m
├── GPUImageTextureOutput.h
├── GPUImageTextureOutput.m
├── GPUImageThreeInputFilter.h
├── GPUImageThreeInputFilter.m
├── GPUImageThresholdEdgeDetectionFilter.h
├── GPUImageThresholdEdgeDetectionFilter.m
├── GPUImageThresholdSketchFilter.h
├── GPUImageThresholdSketchFilter.m
├── GPUImageThresholdedNonMaximumSuppressionFilter.h
├── GPUImageThresholdedNonMaximumSuppressionFilter.m
├── GPUImageTiltShiftFilter.h
├── GPUImageTiltShiftFilter.m
├── GPUImageToneCurveFilter.h
├── GPUImageToneCurveFilter.m
├── GPUImageToonFilter.h
├── GPUImageToonFilter.m
├── GPUImageTransformFilter.h
├── GPUImageTransformFilter.m
├── GPUImageTwoInputCrossTextureSamplingFilter.h
├── GPUImageTwoInputCrossTextureSamplingFilter.m
├── GPUImageTwoInputFilter.h
├── GPUImageTwoInputFilter.m
├── GPUImageTwoPassFilter.h
├── GPUImageTwoPassFilter.m
├── GPUImageTwoPassTextureSamplingFilter.h
├── GPUImageTwoPassTextureSamplingFilter.m
├── GPUImageUIElement.h
├── GPUImageUIElement.m
├── GPUImageUnsharpMaskFilter.h
├── GPUImageUnsharpMaskFilter.m
├── GPUImageVibranceFilter.h
├── GPUImageVibranceFilter.m
├── GPUImageVideoCamera.h
├── GPUImageVideoCamera.m
├── GPUImageVignetteFilter.h
├── GPUImageVignetteFilter.m
├── GPUImageVoronoiConsumerFilter.h
├── GPUImageVoronoiConsumerFilter.m
├── GPUImageWeakPixelInclusionFilter.h
├── GPUImageWeakPixelInclusionFilter.m
├── GPUImageWhiteBalanceFilter.h
├── GPUImageWhiteBalanceFilter.m
├── GPUImageXYDerivativeFilter.h
├── GPUImageXYDerivativeFilter.m
├── GPUImageZoomBlurFilter.h
├── GPUImageZoomBlurFilter.m
├── GPUImageiOSBlurFilter.h
├── GPUImageiOSBlurFilter.m
├── Mac/
│ ├── GPUImage.h
│ ├── GPUImageAVCamera.h
│ ├── GPUImageAVCamera.m
│ ├── GPUImageContext.h
│ ├── GPUImageContext.m
│ ├── GPUImageMac-Info.plist
│ ├── GPUImageMac-Prefix.pch
│ ├── GPUImageMovieWriter.h
│ ├── GPUImageMovieWriter.m
│ ├── GPUImagePicture.h
│ ├── GPUImagePicture.m
│ ├── GPUImageView.h
│ ├── GPUImageView.m
│ └── en.lproj/
│ └── InfoPlist.strings
└── iOS/
├── Framework/
│ ├── GPUImageFramework.h
│ ├── Info.plist
│ └── module.modulemap
├── GPUImage-Prefix.pch
├── GPUImageContext.h
├── GPUImageContext.m
├── GPUImageMovieWriter.h
├── GPUImageMovieWriter.m
├── GPUImagePicture+TextureSubimage.h
├── GPUImagePicture+TextureSubimage.m
├── GPUImagePicture.h
├── GPUImagePicture.m
├── GPUImageView.h
└── GPUImageView.m
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
# Exclude the build directory
build/*
examples/FilterShowcase/build*
# Exclude temp nibs and swap files
*~.nib
*.swp
# Exclude OS X folder attributes
.DS_Store
.svn
# Exclude user-specific XCode 3 and 4 files
*.mode1
*.mode1v3
*.mode2v3
*.perspective
*.perspectivev3
*.pbxuser
*.xcworkspace
xcuserdata
# Documentation
documentation/*
================================================
FILE: .travis.yml
================================================
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
================================================
FILE: GPUImage.podspec
================================================
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
================================================
FILE: License.txt
================================================
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:
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
Neither the name of the GPUImage framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
================================================
FILE: README.md
================================================
# GPUImage #

Brad Larson
http://www.sunsetlakesoftware.com
[@bradlarson](https://twitter.com/bradlarson)
contact@sunsetlakesoftware.com
## Overview ##
The GPUImage framework is a BSD-licensed iOS library that lets you apply GPU-accelerated filters and other effects to images, live camera video, and movies. In comparison to Core Image (part of iOS 5.0), GPUImage allows you to write your own custom filters, supports deployment to iOS 4.0, and has a simpler interface. However, it currently lacks some of the more advanced features of Core Image, such as facial detection.
For massively parallel operations like processing images or live video frames, GPUs have some significant performance advantages over CPUs. On an iPhone 4, a simple image filter can be over 100 times faster to perform on the GPU than an equivalent CPU-based filter.
However, running custom filters on the GPU requires a lot of code to set up and maintain an OpenGL ES 2.0 rendering target for these filters. I created a sample project to do this:
http://www.sunsetlakesoftware.com/2010/10/22/gpu-accelerated-video-processing-mac-and-ios
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.
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 ##
BSD-style, with the full license available with the framework in License.txt.
## Technical requirements ##
- OpenGL ES 2.0: Applications using this will not run on the original iPhone, iPhone 3G, and 1st and 2nd generation iPod touches
- iOS 4.1 as a deployment target (4.0 didn't have some extensions needed for movie reading). iOS 4.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.
## General architecture ##
GPUImage uses OpenGL ES 2.0 shaders to perform image and video manipulation much faster than could be done in CPU-bound routines. However, it hides the complexity of interacting with the OpenGL ES API in a simplified Objective-C interface. This interface lets you define input sources for images and video, attach filters in a chain, and send the resulting processed image or video to the screen, to a UIImage, or to a movie on disk.
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.
For example, an application that takes in live video from the camera, converts that video to a sepia tone, then displays the video onscreen would set up a chain looking something like the following:
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
- *brightness*: The adjusted brightness (-1.0 - 1.0, with 0.0 as the default)
- **GPUImageExposureFilter**: Adjusts the exposure of the image
- *exposure*: The adjusted exposure (-10.0 - 10.0, with 0.0 as the default)
- **GPUImageContrastFilter**: Adjusts the contrast of the image
- *contrast*: The adjusted contrast (0.0 - 4.0, with 1.0 as the default)
- **GPUImageSaturationFilter**: Adjusts the saturation of an image
- *saturation*: The degree of saturation or desaturation to apply to the image (0.0 - 2.0, with 1.0 as the default)
- **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.
- **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.
- **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
- *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
- **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
- *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.
- **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
- **GPUImageiOSBlurFilter**: An attempt to replicate the background blur used on iOS 7 in places like the control center.
- *blurRadiusInPixels*: A radius in pixels to use for the blur, with a default of 12.0. This adjusts the sigma variable in the Gaussian distribution function.
- *saturation*: Saturation ranges from 0.0 (fully desaturated) to 2.0 (max saturation), with 0.8 as the normal level
- *downsampling*: The degree to which to downsample, then upsample the incoming image to minimize computations within the Gaussian blur, with a default of 4.0.
- **GPUImageMedianFilter**: Takes the median value of the three color components, over a 3x3 area
- **GPUImageBilateralFilter**: A bilateral blur, which tries to blur similar color values while preserving sharp edges
- *texelSpacingMultiplier*: A multiplier for the spacing between texel reads, ranging from 0.0 on up, with a default of 4.0
- *distanceNormalizationFactor*: A normalization factor for the distance between central color and sample color, with a default of 8.0.
- **GPUImageTiltShiftFilter**: A simulated tilt shift lens effect
- *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
- **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.
- **GPUImageSobelEdgeDetectionFilter**: Sobel edge detection, with edges highlighted in white
- *texelWidth*:
- *texelHeight*: These parameters affect the visibility of the detected edges
- *edgeStrength*: Adjusts the dynamic range of the filter. Higher values lead to stronger edges, but can saturate the intensity colorspace. Default is 1.0.
- **GPUImagePrewittEdgeDetectionFilter**: Prewitt edge detection, with edges highlighted in white
- *texelWidth*:
- *texelHeight*: These parameters affect the visibility of the detected edges
- *edgeStrength*: Adjusts the dynamic range of the filter. Higher values lead to stronger edges, but can saturate the intensity colorspace. Default is 1.0.
- **GPUImageThresholdEdgeDetectionFilter**: Performs Sobel edge detection, but applies a threshold instead of giving gradual strength values
- *texelWidth*:
- *texelHeight*: These parameters affect the visibility of the detected edges
- *edgeStrength*: Adjusts the dynamic range of the filter. Higher values lead to stronger edges, but can saturate the intensity colorspace. Default is 1.0.
- *threshold*: Any edge above this threshold will be black, and anything below white. Ranges from 0.0 to 1.0, with 0.8 as the default
- **GPUImageCannyEdgeDetectionFilter**: This uses the full Canny process to highlight one-pixel-wide edges
- *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.
- **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.
- **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.
- **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.
- **GPUImageNonMaximumSuppressionFilter**: Currently used only as part of the Harris corner detection filter, this will sample a 1-pixel box around each pixel and determine if the center pixel's red channel is the maximum in that area. If it is, it stays. If not, it is set to 0 for all color components.
- **GPUImageXYDerivativeFilter**: An internal component within the Harris corner detection filter, this calculates the squared difference between the pixels to the left and right of this one, the squared difference of the pixels above and below this one, and the product of those two differences.
- **GPUImageCrosshairGenerator**: This draws a series of crosshairs on an image, most often used for identifying machine vision features. It does not take in a standard image like other filters, but a series of points in its -renderCrosshairsFromArray:count: method, which does the actual drawing. You will need to force this filter to render at the particular output size you need.
- *crosshairWidth*: The width, in pixels, of the crosshairs to be drawn onscreen.
- **GPUImageDilationFilter**: This performs an image dilation operation, where the maximum intensity of the red channel in a rectangular neighborhood is used for the intensity of this pixel. The radius of the rectangular area to sample over is specified on initialization, with a range of 1-4 pixels. This is intended for use with grayscale images, and it expands bright regions.
- **GPUImageRGBDilationFilter**: This is the same as the GPUImageDilationFilter, except that this acts on all color channels, not just the red channel.
- **GPUImageErosionFilter**: This performs an image erosion operation, where the minimum intensity of the red channel in a rectangular neighborhood is used for the intensity of this pixel. The radius of the rectangular area to sample over is specified on initialization, with a range of 1-4 pixels. This is intended for use with grayscale images, and it expands dark regions.
- **GPUImageRGBErosionFilter**: This is the same as the GPUImageErosionFilter, except that this acts on all color channels, not just the red channel.
- **GPUImageOpeningFilter**: This performs an erosion on the red channel of an image, followed by a dilation of the same radius. The radius is set on initialization, with a range of 1-4 pixels. This filters out smaller bright regions.
- **GPUImageRGBOpeningFilter**: This is the same as the GPUImageOpeningFilter, except that this acts on all color channels, not just the red channel.
- **GPUImageClosingFilter**: This performs a dilation on the red channel of an image, followed by an erosion of the same radius. The radius is set on initialization, with a range of 1-4 pixels. This filters out smaller dark regions.
- **GPUImageRGBClosingFilter**: This is the same as the GPUImageClosingFilter, except that this acts on all color channels, not just the red channel.
- **GPUImageLocalBinaryPatternFilter**: This performs a comparison of intensity of the red channel of the 8 surrounding pixels and that of the central one, encoding the comparison results in a bit string that becomes this pixel intensity. The least-significant bit is the top-right comparison, going counterclockwise to end at the right comparison as the most significant bit.
- **GPUImageLowPassFilter**: This applies a low pass filter to incoming video frames. This basically accumulates a weighted rolling average of previous frames with the current ones as they come in. This can be used to denoise video, add motion blur, or be used to create a high pass filter.
- *filterStrength*: This controls the degree by which the previous accumulated frames are blended with the current one. This ranges from 0.0 to 1.0, with a default of 0.5.
- **GPUImageHighPassFilter**: This applies a high pass filter to incoming video frames. This is the inverse of the low pass filter, showing the difference between the current frame and the weighted rolling average of previous ones. This is most useful for motion detection.
- *filterStrength*: This controls the degree by which the previous accumulated frames are blended and then subtracted from the current one. This ranges from 0.0 to 1.0, with a default of 0.5.
- **GPUImageMotionDetector**: This is a motion detector based on a high-pass filter. You set the motionDetectionBlock and on every incoming frame it will give you the centroid of any detected movement in the scene (in normalized X,Y coordinates) as well as an intensity of motion for the scene.
- *lowPassFilterStrength*: This controls the strength of the low pass filter used behind the scenes to establish the baseline that incoming frames are compared with. This ranges from 0.0 to 1.0, with a default of 0.5.
- **GPUImageHoughTransformLineDetector**: Detects lines in the image using a Hough transform into parallel coordinate space. This approach is based entirely on the PC lines process developed by the Graph@FIT research group at the Brno University of Technology and described in their publications: M. Dubská, J. Havel, and A. Herout. Real-Time Detection of Lines using Parallel Coordinates and OpenGL. Proceedings of SCCG 2011, Bratislava, SK, p. 7 (http://medusa.fit.vutbr.cz/public/data/papers/2011-SCCG-Dubska-Real-Time-Line-Detection-Using-PC-and-OpenGL.pdf) and M. Dubská, J. Havel, and A. Herout. PClines — Line detection using parallel coordinates. 2011 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), p. 1489- 1494 (http://medusa.fit.vutbr.cz/public/data/papers/2011-CVPR-Dubska-PClines.pdf).
- *edgeThreshold*: A threshold value for which a point is detected as belonging to an edge for determining lines. Default is 0.9.
- *lineDetectionThreshold*: A threshold value for which a local maximum is detected as belonging to a line in parallel coordinate space. Default is 0.20.
- *linesDetectedBlock*: This block is called on the detection of lines, usually on every processed frame. A C array containing normalized slopes and intercepts in m, b pairs (y=mx+b) is passed in, along with a count of the number of lines detected and the current timestamp of the video frame.
- **GPUImageLineGenerator**: A helper class that generates lines which can overlay the scene. The color of these lines can be adjusted using -setLineColorRed:green:blue:
- *lineWidth*: The width of the lines, in pixels, with a default of 1.0.
- **GPUImageMotionBlurFilter**: Applies a directional motion blur to an image
- *blurSize*: A multiplier for the blur size, ranging from 0.0 on up, with a default of 1.0
- *blurAngle*: The angular direction of the blur, in degrees. 0 degrees by default.
- **GPUImageZoomBlurFilter**: Applies a directional motion blur to an image
- *blurSize*: A multiplier for the blur size, ranging from 0.0 on up, with a default of 1.0
- *blurCenter*: The normalized center of the blur. (0.5, 0.5) by default
### Blending modes ###
- **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)
- **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)
- **GPUImageMultiplyBlendFilter**: Applies a multiply blend of two images
- **GPUImageAddBlendFilter**: Applies an additive blend of two images
- **GPUImageSubtractBlendFilter**: Applies a subtractive blend of two images
- **GPUImageDivideBlendFilter**: Applies a division blend of two images
- **GPUImageOverlayBlendFilter**: Applies an overlay blend of two images
- **GPUImageDarkenBlendFilter**: Blends two images by taking the minimum value of each color component between the images
- **GPUImageLightenBlendFilter**: Blends two images by taking the maximum value of each color component between the images
- **GPUImageColorBurnBlendFilter**: Applies a color burn blend of two images
- **GPUImageColorDodgeBlendFilter**: Applies a color dodge blend of two images
- **GPUImageScreenBlendFilter**: Applies a screen blend of two images
- **GPUImageExclusionBlendFilter**: Applies an exclusion blend of two images
- **GPUImageDifferenceBlendFilter**: Applies a difference blend of two images
- **GPUImageHardLightBlendFilter**: Applies a hard light blend of two images
- **GPUImageSoftLightBlendFilter**: Applies a soft light blend of two images
- **GPUImageAlphaBlendFilter**: Blends the second image over the first, based on the second's alpha channel
- *mix*: The degree with which the second image overrides the first (0.0 - 1.0, with 1.0 as the default)
- **GPUImageSourceOverBlendFilter**: Applies a source over blend of two images
- **GPUImageColorBurnBlendFilter**: Applies a color burn blend of two images
- **GPUImageColorDodgeBlendFilter**: Applies a color dodge blend of two images
- **GPUImageNormalBlendFilter**: Applies a normal blend of two images
- **GPUImageColorBlendFilter**: Applies a color blend of two images
- **GPUImageHueBlendFilter**: Applies a hue blend of two images
- **GPUImageSaturationBlendFilter**: Applies a saturation blend of two images
- **GPUImageLuminosityBlendFilter**: Applies a luminosity blend of two images
- **GPUImageLinearBurnBlendFilter**: Applies a linear burn blend of two images
- **GPUImagePoissonBlendFilter**: Applies a Poisson blend of two images
- *mix*: Mix ranges from 0.0 (only image 1) to 1.0 (only image 2 gradients), with 1.0 as the normal level
- *numIterations*: The number of times to propagate the gradients. Crank this up to 100 or even 1000 if you want to get anywhere near convergence. Yes, this will be slow.
- **GPUImageMaskFilter**: Masks one image using another
### Visual effects ###
- **GPUImagePixellateFilter**: Applies a pixellation effect on an image or video
- *fractionalWidthOfAPixel*: How large the pixels are, as a fraction of the width and height of the image (0.0 - 1.0, default 0.05)
- **GPUImagePolarPixellateFilter**: Applies a pixellation effect on an image or video, based on polar coordinates instead of Cartesian ones
- *center*: The center about which to apply the pixellation, defaulting to (0.5, 0.5)
- *pixelSize*: The fractional pixel size, split into width and height components. The default is (0.05, 0.05)
- **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.
- **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.
- **GPUImageSketchFilter**: Converts video to look like a sketch. This is just the Sobel edge detection filter with the colors inverted
- *texelWidth*:
- *texelHeight*: These parameters affect the visibility of the detected edges
- *edgeStrength*: Adjusts the dynamic range of the filter. Higher values lead to stronger edges, but can saturate the intensity colorspace. Default is 1.0.
- **GPUImageThresholdSketchFilter**: Same as the sketch filter, only the edges are thresholded instead of being grayscale
- *texelWidth*:
- *texelHeight*: These parameters affect the visibility of the detected edges
- *edgeStrength*: Adjusts the dynamic range of the filter. Higher values lead to stronger edges, but can saturate the intensity colorspace. Default is 1.0.
- *threshold*: Any edge above this threshold will be black, and anything below white. Ranges from 0.0 to 1.0, with 0.8 as the default
- **GPUImageToonFilter**: This uses Sobel edge detection to place a black border around objects, and then it quantizes the colors present in the image to give a cartoon-like quality to the image.
- *texelWidth*:
- *texelHeight*: These parameters affect the visibility of the detected edges
- *threshold*: The sensitivity of the edge detection, with lower values being more sensitive. Ranges from 0.0 to 1.0, with 0.2 as the default
- *quantizationLevels*: The number of color levels to represent in the final image. Default is 10.0
- **GPUImageSmoothToonFilter**: This uses a similar process as the GPUImageToonFilter, only it precedes the toon effect with a Gaussian blur to smooth out noise.
- *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
- **GPUImageEmbossFilter**: Applies an embossing effect on the image
- *intensity*: The strength of the embossing, from 0.0 to 4.0, with 1.0 as the normal level
- **GPUImagePosterizeFilter**: This reduces the color dynamic range into the number of steps specified, leading to a cartoon-like simple shading of the image.
- *colorLevels*: The number of color levels to reduce the image space to. This ranges from 1 to 256, with a default of 10.
- **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
- **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
- **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
- **GPUImageStretchDistortionFilter**: Creates a stretch distortion of the image
- *center*: The center of the image (in normalized coordinates from 0 - 1.0) about which to distort, with a default of (0.5, 0.5)
- **GPUImageSphereRefractionFilter**: Simulates the refraction through a glass sphere
- *center*: The center about which to apply the distortion, with a default of (0.5, 0.5)
- *radius*: The radius of the distortion, ranging from 0.0 to 1.0, with a default of 0.25
- *refractiveIndex*: The index of refraction for the sphere, with a default of 0.71
- **GPUImageGlassSphereFilter**: Same as the GPUImageSphereRefractionFilter, only the image is not inverted and there's a little bit of frosting at the edges of the glass
- *center*: The center about which to apply the distortion, with a default of (0.5, 0.5)
- *radius*: The radius of the distortion, ranging from 0.0 to 1.0, with a default of 0.25
- *refractiveIndex*: The index of refraction for the sphere, with a default of 0.71
- **GPUImageVignetteFilter**: Performs a vignetting effect, fading out the image at the edges
- *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 ##
Several sample applications are bundled with the framework source. Most are compatible with both iPhone and iPad-class devices. They attempt to show off various aspects of the framework and should be used as the best examples of the API while the framework is under development. These include:
### SimpleImageFilter ###
A bundled JPEG image is loaded into the application at launch, a filter is applied to it, and the result rendered to the screen. Additionally, this sample shows two ways of taking in an image, filtering it, and saving it to disk.
### SimpleVideoFilter ###
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.
### FilterShowcase ###
This demonstrates every filter supplied with GPUImage.
### BenchmarkSuite ###
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.
================================================
FILE: build.sh
================================================
#!/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
================================================
FILE: examples/Mac/FilterShowcase/FilterShowcase/FilterShowcase-Info.plist
================================================
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
================================================
FILE: examples/Mac/FilterShowcase/FilterShowcase/FilterShowcase-Prefix.pch
================================================
//
// Prefix header for all source files of the 'FilterShowcase' target in the 'FilterShowcase' project
//
#ifdef __OBJC__
#import
#endif
================================================
FILE: examples/Mac/FilterShowcase/FilterShowcase/SLSAppDelegate.h
================================================
#import
#import "SLSFilterShowcaseWindowController.h"
@interface SLSAppDelegate : NSObject
{
SLSFilterShowcaseWindowController *windowController;
}
@end
================================================
FILE: examples/Mac/FilterShowcase/FilterShowcase/SLSAppDelegate.m
================================================
#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
================================================
FILE: examples/Mac/FilterShowcase/FilterShowcase/en.lproj/Credits.rtf
================================================
{\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\
}
================================================
FILE: examples/Mac/FilterShowcase/FilterShowcase/en.lproj/InfoPlist.strings
================================================
/* Localized versions of Info.plist keys */
================================================
FILE: examples/Mac/FilterShowcase/FilterShowcase/en.lproj/MainMenu.xib
================================================
1080
12D78
3084
1187.37
626.00
NSCustomObject
NSMenu
NSMenuItem
com.apple.InterfaceBuilder.CocoaPlugin
SLSAppDelegate
NSObject
IBProjectSource
./Classes/SLSAppDelegate.h
0
IBCocoaFramework
YES
3
{11, 11}
{10, 3}
YES
================================================
FILE: examples/Mac/FilterShowcase/FilterShowcase/main.m
================================================
#import
int main(int argc, char *argv[])
{
return NSApplicationMain(argc, (const char **)argv);
}
================================================
FILE: examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/project.pbxproj
================================================
// !$*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 */;
}
================================================
FILE: examples/Mac/FilterShowcase/FilterShowcase.xcodeproj/xcshareddata/xcschemes/FilterShowcase.xcscheme
================================================
================================================
FILE: examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.h
================================================
#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
================================================
FILE: examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.m
================================================
#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
================================================
FILE: examples/Mac/FilterShowcase/SLSFilterShowcaseWindowController.xib
================================================
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
================================================
FILE: examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/AppDelegate.swift
================================================
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) {
}
}
================================================
FILE: examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/Base.lproj/MainMenu.xib
================================================
================================================
FILE: examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/FilterShowcaseWindowController.swift
================================================
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)
}
}
}
================================================
FILE: examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/FilterShowcaseWindowController.xib
================================================
================================================
FILE: examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/Images.xcassets/AppIcon.appiconset/Contents.json
================================================
{
"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"
}
}
================================================
FILE: examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/Info.plist
================================================
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
================================================
FILE: examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift/main.swift
================================================
import Cocoa
NSApplicationMain(Process.argc, Process.unsafeArgv)
================================================
FILE: examples/Mac/FilterShowcaseSwift/FilterShowcaseSwift.xcodeproj/project.pbxproj
================================================
// !$*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 */;
}
================================================
FILE: examples/Mac/FilterShowcaseSwift/FilterShowcaseSwiftTests/FilterShowcaseSwiftTests.swift
================================================
//
// 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.
}
}
}
================================================
FILE: examples/Mac/FilterShowcaseSwift/FilterShowcaseSwiftTests/Info.plist
================================================
CFBundleDevelopmentRegion
en
CFBundleExecutable
${EXECUTABLE_NAME}
CFBundleIdentifier
com.sunsetlakesoftware.${PRODUCT_NAME:rfc1034identifier}
CFBundleInfoDictionaryVersion
6.0
CFBundleName
${PRODUCT_NAME}
CFBundlePackageType
BNDL
CFBundleShortVersionString
1.0
CFBundleSignature
????
CFBundleVersion
1
================================================
FILE: examples/Mac/MultiViewFilterExample/MultiViewFilterExample/MultiViewFilterExample-Info.plist
================================================
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
================================================
FILE: examples/Mac/MultiViewFilterExample/MultiViewFilterExample/MultiViewFilterExample-Prefix.pch
================================================
//
// Prefix header for all source files of the 'MultiViewFilterExample' target in the 'MultiViewFilterExample' project
//
#ifdef __OBJC__
#import
#endif
================================================
FILE: examples/Mac/MultiViewFilterExample/MultiViewFilterExample/SLSAppDelegate.h
================================================
#import
#import "SLSMultiViewWindowController.h"
@interface SLSAppDelegate : NSObject
{
SLSMultiViewWindowController *multiViewWindowController;
}
@property (assign) IBOutlet NSWindow *window;
@end
================================================
FILE: examples/Mac/MultiViewFilterExample/MultiViewFilterExample/SLSAppDelegate.m
================================================
#import "SLSAppDelegate.h"
@implementation SLSAppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
multiViewWindowController = [[SLSMultiViewWindowController alloc] initWithWindowNibName:@"SLSMultiViewWindowController"];
[multiViewWindowController showWindow:self];
}
@end
================================================
FILE: examples/Mac/MultiViewFilterExample/MultiViewFilterExample/SLSMultiViewWindowController.h
================================================
#import
#import
@interface SLSMultiViewWindowController : NSWindowController
{
GPUImageFilter *filter1, *filter2, *filter3;
GPUImageAVCamera *videoCamera;
}
@property(readwrite) IBOutlet GPUImageView *upperLeftView, *upperRightView, *lowerLeftView, *lowerRightView;
@end
================================================
FILE: examples/Mac/MultiViewFilterExample/MultiViewFilterExample/SLSMultiViewWindowController.m
================================================
#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
================================================
FILE: examples/Mac/MultiViewFilterExample/MultiViewFilterExample/SLSMultiViewWindowController.xib
================================================
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
================================================
FILE: examples/Mac/MultiViewFilterExample/MultiViewFilterExample/Shader1.fsh
================================================
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);
}
================================================
FILE: examples/Mac/MultiViewFilterExample/MultiViewFilterExample/Shader2.fsh
================================================
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 );
}
================================================
FILE: examples/Mac/MultiViewFilterExample/MultiViewFilterExample/en.lproj/Credits.rtf
================================================
{\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\
}
================================================
FILE: examples/Mac/MultiViewFilterExample/MultiViewFilterExample/en.lproj/InfoPlist.strings
================================================
/* Localized versions of Info.plist keys */
================================================
FILE: examples/Mac/MultiViewFilterExample/MultiViewFilterExample/en.lproj/MainMenu.xib
================================================
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
================================================
FILE: examples/Mac/MultiViewFilterExample/MultiViewFilterExample/main.m
================================================
#import
int main(int argc, char *argv[])
{
return NSApplicationMain(argc, (const char **)argv);
}
================================================
FILE: examples/Mac/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/project.pbxproj
================================================
// !$*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 */;
}
================================================
FILE: examples/Mac/MultiViewFilterExample/MultiViewFilterExample.xcodeproj/xcshareddata/xcschemes/MultiViewFilterExample.xcscheme
================================================
================================================
FILE: examples/Mac/PlaygroundExample/PlaygroundExample/GPUImagePlayground.playground/Resources/CustomFilter.fsh
================================================
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);
}
================================================
FILE: examples/Mac/PlaygroundExample/PlaygroundExample/GPUImagePlayground.playground/contents.xcplayground
================================================
================================================
FILE: examples/Mac/PlaygroundExample/PlaygroundExample/GPUImagePlayground.playground/section-1.swift
================================================
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)
================================================
FILE: examples/Mac/PlaygroundExample/PlaygroundExample/GPUImagePlayground.playground/timeline.xctimeline
================================================
================================================
FILE: examples/Mac/PlaygroundExample/PlaygroundExample/main.swift
================================================
import Foundation
println("Hello, World!")
================================================
FILE: examples/Mac/PlaygroundExample/PlaygroundExample.xcodeproj/project.pbxproj
================================================
// !$*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 */;
}
================================================
FILE: examples/Mac/ShaderDesigner/ShaderDesigner/AppDelegate.h
================================================
#import
#import "ShaderDesignerWindowController.h"
@interface AppDelegate : NSObject
{
ShaderDesignerWindowController *windowController;
}
@end
================================================
FILE: examples/Mac/ShaderDesigner/ShaderDesigner/AppDelegate.m
================================================
#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
================================================
FILE: examples/Mac/ShaderDesigner/ShaderDesigner/Base.lproj/MainMenu.xib
================================================
================================================
FILE: examples/Mac/ShaderDesigner/ShaderDesigner/Images.xcassets/AppIcon.appiconset/Contents.json
================================================
{
"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"
}
}
================================================
FILE: examples/Mac/ShaderDesigner/ShaderDesigner/Info.plist
================================================
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
================================================
FILE: examples/Mac/ShaderDesigner/ShaderDesigner/ShaderDesignerWindowController.h
================================================
#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
================================================
FILE: examples/Mac/ShaderDesigner/ShaderDesigner/ShaderDesignerWindowController.m
================================================
#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
================================================
FILE: examples/Mac/ShaderDesigner/ShaderDesigner/ShaderDesignerWindowController.xib
================================================
================================================
FILE: examples/Mac/ShaderDesigner/ShaderDesigner/main.m
================================================
#import
int main(int argc, const char * argv[]) {
return NSApplicationMain(argc, argv);
}
================================================
FILE: examples/Mac/ShaderDesigner/ShaderDesigner.xcodeproj/project.pbxproj
================================================
// !$*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 */;
}
================================================
FILE: examples/Mac/SimplePhotoFilter/SimplePhotoFilter/SLSDocument.h
================================================
#import
#import
@interface SLSDocument : NSDocument
{
GPUImagePicture *inputPicture;
GPUImageFilter *imageFilter;
}
@property(readwrite, weak) IBOutlet GPUImageView *imageView;
@property(readwrite, nonatomic) CGFloat sliderSetting;
@end
================================================
FILE: examples/Mac/SimplePhotoFilter/SimplePhotoFilter/SLSDocument.m
================================================
#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
================================================
FILE: examples/Mac/SimplePhotoFilter/SimplePhotoFilter/SimplePhotoFilter-Info.plist
================================================
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
================================================
FILE: examples/Mac/SimplePhotoFilter/SimplePhotoFilter/SimplePhotoFilter-Prefix.pch
================================================
//
// Prefix header for all source files of the 'SimplePhotoFilter' target in the 'SimplePhotoFilter' project
//
#ifdef __OBJC__
#import
#endif
================================================
FILE: examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/Credits.rtf
================================================
{\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\
}
================================================
FILE: examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/InfoPlist.strings
================================================
/* Localized versions of Info.plist keys */
================================================
FILE: examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/MainMenu.xib
================================================
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
================================================
FILE: examples/Mac/SimplePhotoFilter/SimplePhotoFilter/en.lproj/SLSDocument.xib
================================================
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
================================================
FILE: examples/Mac/SimplePhotoFilter/SimplePhotoFilter/main.m
================================================
//
// 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);
}
================================================
FILE: examples/Mac/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/project.pbxproj
================================================
// !$*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 */;
}
================================================
FILE: examples/Mac/SimplePhotoFilter/SimplePhotoFilter.xcodeproj/xcshareddata/xcschemes/SimplePhotoFilter.xcscheme
================================================
================================================
FILE: examples/Mac/SimpleVideoFileFilter/SimpleVideoFileFilter.xcodeproj/project.pbxproj
================================================
// !$*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 */;
}
================================================
FILE: examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/AppDelegate.h
================================================
#import
#import "SLSSimpleVideoFileFilterWindowController.h"
@interface AppDelegate : NSObject
{
SLSSimpleVideoFileFilterWindowController *simpleVideoFileFilterWindowController;
}
@end
================================================
FILE: examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/AppDelegate.m
================================================
#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
================================================
FILE: examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/Base.lproj/MainMenu.xib
================================================
Default
Left to Right
Right to Left
Default
Left to Right
Right to Left
================================================
FILE: examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/Images.xcassets/AppIcon.appiconset/Contents.json
================================================
{
"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"
}
}
================================================
FILE: examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/Info.plist
================================================
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
================================================
FILE: examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/SLSSimpleVideoFileFilterWindowController.h
================================================
#import
@interface SLSSimpleVideoFileFilterWindowController : NSWindowController
@end
================================================
FILE: examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/SLSSimpleVideoFileFilterWindowController.m
================================================
#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
================================================
FILE: examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/SLSSimpleVideoFileFilterWindowController.xib
================================================
================================================
FILE: examples/Mac/SimpleVideoFileFilter/SimpleVideoFilter/main.m
================================================
//
// 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);
}
================================================
FILE: examples/Mac/SimpleVideoFileFilter/SimpleVideoFilterTests/Info.plist
================================================
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
================================================
FILE: examples/Mac/SimpleVideoFileFilter/SimpleVideoFilterTests/SimpleVideoFilterTests.m
================================================
//
// 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
================================================
FILE: examples/Mac/SimpleVideoFilter/SimpleVideoFilter/AppDelegate.h
================================================
#import
#import "SLSSimpleVideoFilterWindowController.h"
@interface AppDelegate : NSObject
{
SLSSimpleVideoFilterWindowController *simpleVideoFilterWindowController;
}
@end
================================================
FILE: examples/Mac/SimpleVideoFilter/SimpleVideoFilter/AppDelegate.m
================================================
#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
================================================
FILE: examples/Mac/SimpleVideoFilter/SimpleVideoFilter/Base.lproj/MainMenu.xib
================================================
Default
Left to Right
Right to Left
Default
Left to Right
Right to Left
================================================
FILE: examples/Mac/SimpleVideoFilter/SimpleVideoFilter/Images.xcassets/AppIcon.appiconset/Contents.json
================================================
{
"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"
}
}
================================================
FILE: examples/Mac/SimpleVideoFilter/SimpleVideoFilter/Info.plist
================================================
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
================================================
FILE: examples/Mac/SimpleVideoFilter/SimpleVideoFilter/SLSSimpleVideoFilterWindowController.h
================================================
#import
#import
@interface SLSSimpleVideoFilterWindowController : NSWindowController
{
GPUImageAVCamera *videoCamera;
GPUImageOutput *filter;
GPUImageMovieWriter *movieWriter;
}
@property (weak) IBOutlet GPUImageView *videoView;
@end
================================================
FILE: examples/Mac/SimpleVideoFilter/SimpleVideoFilter/SLSSimpleVideoFilterWindowController.m
================================================
#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
================================================
FILE: examples/Mac/SimpleVideoFilter/SimpleVideoFilter/SLSSimpleVideoFilterWindowController.xib
================================================
================================================
FILE: examples/Mac/SimpleVideoFilter/SimpleVideoFilter/main.m
================================================
//
// 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);
}
================================================
FILE: examples/Mac/SimpleVideoFilter/SimpleVideoFilter.xcodeproj/project.pbxproj
================================================
// !$*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 */;
}
================================================
FILE: examples/Mac/SimpleVideoFilter/SimpleVideoFilterTests/Info.plist
================================================
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
================================================
FILE: examples/Mac/SimpleVideoFilter/SimpleVideoFilterTests/SimpleVideoFilterTests.m
================================================
//
// 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
================================================
FILE: examples/iOS/BenchmarkSuite/BenchmarkSuite/BenchmarkAppDelegate.h
================================================
#import
@class ImageFilteringBenchmarkController, VideoFilteringBenchmarkController;
@interface BenchmarkAppDelegate : UIResponder
{
UITabBarController *mainTabBarController;
ImageFilteringBenchmarkController *imageFilteringBenchmarkController;
VideoFilteringBenchmarkController *videoFilteringBenchmarkController;
}
@property (strong, nonatomic) UIWindow *window;
@end
================================================
FILE: examples/iOS/BenchmarkSuite/BenchmarkSuite/BenchmarkAppDelegate.m
================================================
#import "BenchmarkAppDelegate.h"
#import "ImageFilteringBenchmarkController.h"
#import "VideoFilteringBenchmarkController.h"
// The tab bar icons in this application are courtesy of Joseph Wain / glyphish.com
// See the GlyphishIconLicense.txt file for more information on these icons
@implementation BenchmarkAppDelegate
@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];
mainTabBarController = [[UITabBarController alloc] initWithNibName:nil bundle:nil];
imageFilteringBenchmarkController = [[ImageFilteringBenchmarkController alloc] initWithNibName:@"BenchmarkTableViewController" bundle:nil];
UIImage *itemImage = [UIImage imageNamed:@"41-picture-frame"];
UITabBarItem *mathTabItem = [[UITabBarItem alloc] initWithTitle:@"Still images" image:itemImage tag:0];
imageFilteringBenchmarkController.tabBarItem = mathTabItem;
videoFilteringBenchmarkController = [[VideoFilteringBenchmarkController alloc] initWithNibName:@"BenchmarkTableViewController" bundle:nil];
UIImage *itemImage2 = [UIImage imageNamed:@"86-camera"];
UITabBarItem *mathTabItem2 = [[UITabBarItem alloc] initWithTitle:@"Live video" image:itemImage2 tag:1];
videoFilteringBenchmarkController.tabBarItem = mathTabItem2;
NSArray *arrayOfViewControllers = [[NSArray alloc] initWithObjects:imageFilteringBenchmarkController, videoFilteringBenchmarkController, nil];
mainTabBarController.viewControllers = arrayOfViewControllers;
mainTabBarController.selectedViewController = imageFilteringBenchmarkController;
self.window.rootViewController = mainTabBarController;
[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
================================================
FILE: examples/iOS/BenchmarkSuite/BenchmarkSuite/BenchmarkSuite-Info.plist
================================================
CFBundleDevelopmentRegion
en
CFBundleDisplayName
${PRODUCT_NAME}
CFBundleExecutable
${EXECUTABLE_NAME}
CFBundleIconFiles
CFBundleIdentifier
com.sunsetlakesoftware.${PRODUCT_NAME:rfc1034identifier}
CFBundleInfoDictionaryVersion
6.0
CFBundleName
${PRODUCT_NAME}
CFBundlePackageType
APPL
CFBundleShortVersionString
1.0
CFBundleSignature
????
CFBundleVersion
1.0
LSRequiresIPhoneOS
UIFileSharingEnabled
UIPrerenderedIcon
UIRequiredDeviceCapabilities
opengles-2
UISupportedInterfaceOrientations
UIInterfaceOrientationPortrait
UIInterfaceOrientationLandscapeLeft
UIInterfaceOrientationLandscapeRight
UISupportedInterfaceOrientations~ipad
UIInterfaceOrientationPortrait
UIInterfaceOrientationPortraitUpsideDown
UIInterfaceOrientationLandscapeLeft
UIInterfaceOrientationLandscapeRight
================================================
FILE: examples/iOS/BenchmarkSuite/BenchmarkSuite/BenchmarkSuite-Prefix.pch
================================================
//
// Prefix header for all source files of the 'BenchmarkSuite' target in the 'BenchmarkSuite' project
//
#import
#ifndef __IPHONE_3_0
#warning "This project uses features only available in iOS SDK 3.0 and later."
#endif
#ifdef __OBJC__
#import
#import
#endif
================================================
FILE: examples/iOS/BenchmarkSuite/BenchmarkSuite/BenchmarkTableViewController.h
================================================
#import
@interface BenchmarkTableViewController : UITableViewController
{
CGFloat processingTimeForCPURoutine, processingTimeForCoreImageRoutine, processingTimeForGPUImageRoutine;
}
// Benchmarks
- (void)runBenchmark;
@end
================================================
FILE: examples/iOS/BenchmarkSuite/BenchmarkSuite/BenchmarkTableViewController.m
================================================
#import "BenchmarkTableViewController.h"
typedef enum { GPUIMAGE_BENCHMARK_CPU, GPUIMAGE_BENCHMARK_COREIMAGE, GPUIMAGE_BENCHMARK_GPUIMAGE } GPUImageBenchmarkSection;
@implementation BenchmarkTableViewController
#pragma mark -
#pragma mark Initialization and teardown
- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
}
return self;
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.tableView.frame.size.width, 60.0f)];
UIButton *benchmarkButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
benchmarkButton.frame = CGRectMake(60.0f, 20.0f, 200.0f, 40.0f);
[benchmarkButton setTitle:@"Run Benchmark" forState:UIControlStateNormal];
[benchmarkButton addTarget:self action:@selector(runBenchmark) forControlEvents:(UIControlEventTouchUpInside | UIControlEventTouchUpOutside)];
[self.tableView.tableHeaderView addSubview:benchmarkButton];
}
- (void)viewDidUnload
{
[super viewDidUnload];
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 3;
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
return NSLocalizedStringFromTable(@"Processing times", @"Localized", nil);
return nil;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"StillImageBenchmarkCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
cell.detailTextLabel.textColor = [UIColor colorWithRed:50.0f/255.0f green:79.0f/255.0f blue:133.0f/255.0f alpha:1.0f];
cell.detailTextLabel.highlightedTextColor = [UIColor whiteColor];
}
switch (indexPath.row)
{
case GPUIMAGE_BENCHMARK_CPU:
{
cell.textLabel.text = NSLocalizedStringFromTable(@"CPU", @"Localized", nil);
cell.detailTextLabel.text = [NSString stringWithFormat:@"%.2f ms", processingTimeForCPURoutine];
}; break;
case GPUIMAGE_BENCHMARK_COREIMAGE:
{
cell.textLabel.text = NSLocalizedStringFromTable(@"Core Image", @"Localized", nil);
cell.detailTextLabel.text = [NSString stringWithFormat:@"%.2f ms", processingTimeForCoreImageRoutine];
}; break;
case GPUIMAGE_BENCHMARK_GPUIMAGE:
{
cell.textLabel.text = NSLocalizedStringFromTable(@"GPUImage", @"Localized", nil);
cell.detailTextLabel.text = [NSString stringWithFormat:@"%.2f ms", processingTimeForGPUImageRoutine];
}; break;
default:
{
cell.textLabel.text = NSLocalizedStringFromTable(@"CPU", @"Localized", nil);
cell.detailTextLabel.text = [NSString stringWithFormat:@"%.2f ms", processingTimeForCPURoutine];
}
}
return cell;
}
#pragma mark - Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// Navigation logic may go here. Create and push another view controller.
/*
<#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];
// ...
// Pass the selected object to the new view controller.
[self.navigationController pushViewController:detailViewController animated:YES];
*/
}
#pragma mark -
#pragma mark Benchmarks
- (void)runBenchmark;
{
}
@end
================================================
FILE: examples/iOS/BenchmarkSuite/BenchmarkSuite/BenchmarkTableViewController.xib
================================================
1280
11D50
1938
1138.32
568.00
com.apple.InterfaceBuilder.IBCocoaTouchPlugin
933
IBProxyObject
IBUITableView
com.apple.InterfaceBuilder.IBCocoaTouchPlugin
PluginDependencyRecalculationVersion
IBFilesOwner
IBCocoaTouchFramework
IBFirstResponder
IBCocoaTouchFramework
274
{{0, 20}, {320, 411}}
10
549453824
{512, 1}
TU0AKgAACAjFzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/
y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/
xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/
xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/
xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/
xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/
xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/
y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/
y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/
xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/
xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/
xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/
xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/
xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/
y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/
y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/
xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/
xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/
xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/
xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/
xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/
y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/
y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/
xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/
xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/
xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/
xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/
xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/
y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/
y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/
xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/
xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/
xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/
xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/
xczS/8vS2P/L0tj/xczU/wANAQAAAwAAAAECAAAAAQEAAwAAAAEAAQAAAQIAAwAAAAQAAAiqAQMAAwAA
AAEAAQAAAQYAAwAAAAEAAgAAAREABAAAAAEAAAAIARIAAwAAAAEAAQAAARUAAwAAAAEABAAAARYAAwAA
AAEAAQAAARcABAAAAAEAAAgAARwAAwAAAAEAAQAAAVIAAwAAAAEAAQAAAVMAAwAAAAQAAAiyAAAAAAAI
AAgACAAIAAEAAQABAAE
3
MCAwAA
groupTableViewBackgroundColor
NO
YES
NO
IBCocoaTouchFramework
NO
1
2
0
YES
44
10
10
view
5
dataSource
6
delegate
7
0
-1
File's Owner
-2
4
ImageFilteringBenchmarkController
com.apple.InterfaceBuilder.IBCocoaTouchPlugin
UIResponder
com.apple.InterfaceBuilder.IBCocoaTouchPlugin
com.apple.InterfaceBuilder.IBCocoaTouchPlugin
7
0
IBCocoaTouchFramework
YES
3
933
================================================
FILE: examples/iOS/BenchmarkSuite/BenchmarkSuite/ImageFilteringBenchmarkController.h
================================================
#import "BenchmarkTableViewController.h"
@interface ImageFilteringBenchmarkController : BenchmarkTableViewController
{
CIContext *coreImageContext;
}
// Still image benchmarks
- (UIImage *)imageProcessedOnCPU:(UIImage *)imageToProcess;
- (UIImage *)imageProcessedUsingCoreImage:(UIImage *)imageToProcess;
- (UIImage *)imageProcessedUsingGPUImage:(UIImage *)imageToProcess;
- (void)writeImage:(UIImage *)imageToWrite toFile:(NSString *)fileName;
@end
================================================
FILE: examples/iOS/BenchmarkSuite/BenchmarkSuite/ImageFilteringBenchmarkController.m
================================================
#import "ImageFilteringBenchmarkController.h"
#import "GPUImage.h"
@implementation ImageFilteringBenchmarkController
#pragma mark -
#pragma mark Still image benchmarks
- (void)runBenchmark;
{
// Take in a UIImage, filter it at full resolution (2000 x 1494), and time one operation of this
// Images are written out to disk to verify that the filter worked as expected
UIImage *inputImage = [UIImage imageNamed:@"Lambeau.jpg"];
[self imageProcessedOnCPU:inputImage]; // I've disabled the writing here, because something's busted with that
// UIImage *imageFilteredUsingCPURoutine = [self imageProcessedOnCPU:inputImage];
// [self writeImage:imageFilteredUsingCPURoutine toFile:@"Lambeau-CPUFiltered.png"];
// Pulling creating the Core Image context out of the benchmarking area, because it can only be created once and reused
if (coreImageContext == nil)
{
coreImageContext = [CIContext contextWithOptions:nil];
}
UIImage *imageFilteredUsingCoreImageRoutine = [self imageProcessedUsingCoreImage:inputImage];
[self writeImage:imageFilteredUsingCoreImageRoutine toFile:@"Lambeau-CoreImageFiltered.png"];
UIImage *imageFilteredUsingGPUImageRoutine = [self imageProcessedUsingGPUImage:inputImage];
[self writeImage:imageFilteredUsingGPUImageRoutine toFile:@"Lambeau-GPUImageFiltered.png"];
[self.tableView reloadData];
}
- (UIImage *)imageProcessedOnCPU:(UIImage *)imageToProcess;
{
// Drawn from Rahul Vyas' answer on Stack Overflow at http://stackoverflow.com/a/4211729/19679
CFAbsoluteTime elapsedTime, startTime = CFAbsoluteTimeGetCurrent();
CGImageRef cgImage = [imageToProcess CGImage];
CGImageRetain(cgImage);
CGDataProviderRef provider = CGImageGetDataProvider(cgImage);
CFDataRef bitmapData = CGDataProviderCopyData(provider);
UInt8* data = (UInt8*)CFDataGetBytePtr(bitmapData);
CGImageRelease(cgImage);
int width = imageToProcess.size.width;
int height = imageToProcess.size.height;
NSInteger myDataLength = width * height * 4;
for (int i = 0; i < myDataLength; i+=4)
{
UInt8 r_pixel = data[i];
UInt8 g_pixel = data[i+1];
UInt8 b_pixel = data[i+2];
int outputRed = (r_pixel * .393) + (g_pixel *.769) + (b_pixel * .189);
int outputGreen = (r_pixel * .349) + (g_pixel *.686) + (b_pixel * .168);
int outputBlue = (r_pixel * .272) + (g_pixel *.534) + (b_pixel * .131);
if(outputRed>255)outputRed=255;
if(outputGreen>255)outputGreen=255;
if(outputBlue>255)outputBlue=255;
data[i] = outputRed;
data[i+1] = outputGreen;
data[i+2] = outputBlue;
}
CGDataProviderRef provider2 = CGDataProviderCreateWithData(NULL, data, myDataLength, NULL);
int bitsPerComponent = 8;
int bitsPerPixel = 32;
int bytesPerRow = 4 * width;
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;
CGImageRef imageRef = CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider2, NULL, NO, renderingIntent);
CGColorSpaceRelease(colorSpaceRef);
CGDataProviderRelease(provider2);
CFRelease(bitmapData);
UIImage *sepiaImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
elapsedTime = CFAbsoluteTimeGetCurrent() - startTime;
processingTimeForCPURoutine = elapsedTime * 1000.0;
return sepiaImage;
}
- (UIImage *)imageProcessedUsingCoreImage:(UIImage *)imageToProcess;
{
/*
NSArray *filterNames = [CIFilter filterNamesInCategory:kCICategoryBuiltIn];
NSLog(@"Built in filters");
for (NSString *currentFilterName in filterNames)
{
NSLog(@"%@", currentFilterName);
}
*/
CFAbsoluteTime elapsedTime, startTime = CFAbsoluteTimeGetCurrent();
CIImage *inputImage = [[CIImage alloc] initWithCGImage:imageToProcess.CGImage];
CIFilter *sepiaTone = [CIFilter filterWithName:@"CISepiaTone"
keysAndValues: kCIInputImageKey, inputImage,
@"inputIntensity", [NSNumber numberWithFloat:1.0], nil];
CIImage *result = [sepiaTone outputImage];
// UIImage *resultImage = [UIImage imageWithCIImage:result]; // This gives a nil image, because it doesn't render, unless I'm doing something wrong
CGImageRef resultRef = [coreImageContext createCGImage:result fromRect:CGRectMake(0, 0, imageToProcess.size.width, imageToProcess.size.height)];
UIImage *resultImage = [UIImage imageWithCGImage:resultRef];
CGImageRelease(resultRef);
elapsedTime = CFAbsoluteTimeGetCurrent() - startTime;
processingTimeForCoreImageRoutine = elapsedTime * 1000.0;
return resultImage;
}
- (UIImage *)imageProcessedUsingGPUImage:(UIImage *)imageToProcess;
{
CFAbsoluteTime elapsedTime, startTime = CFAbsoluteTimeGetCurrent();
GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:imageToProcess];
GPUImageSepiaFilter *stillImageFilter = [[GPUImageSepiaFilter alloc] init];
[stillImageSource addTarget:stillImageFilter];
[stillImageFilter useNextFrameForImageCapture];
[stillImageSource processImage];
UIImage *currentFilteredVideoFrame = [stillImageFilter imageFromCurrentFramebuffer];
elapsedTime = CFAbsoluteTimeGetCurrent() - startTime;
processingTimeForGPUImageRoutine = elapsedTime * 1000.0;
return currentFilteredVideoFrame;
}
- (void)writeImage:(UIImage *)imageToWrite toFile:(NSString *)fileName;
{
if (imageToWrite == nil)
{
return;
}
NSData *dataForPNGFile = UIImagePNGRepresentation(imageToWrite);
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSError *error = nil;
if (![dataForPNGFile writeToFile:[documentsDirectory stringByAppendingPathComponent:fileName] options:NSAtomicWrite error:&error])
{
return;
}
}
@end
================================================
FILE: examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringBenchmarkController.h
================================================
#import "BenchmarkTableViewController.h"
#import "VideoFilteringDisplayController.h"
@interface VideoFilteringBenchmarkController : BenchmarkTableViewController
{
VideoFilteringDisplayController *videoFilteringDisplayController;
}
@end
================================================
FILE: examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringBenchmarkController.m
================================================
#import "VideoFilteringBenchmarkController.h"
@implementation VideoFilteringBenchmarkController
#pragma mark -
#pragma mark Benchmarks
- (void)runBenchmark;
{
videoFilteringDisplayController = [[VideoFilteringDisplayController alloc] initWithNibName:@"VideoFilteringDisplayController" bundle:nil];
videoFilteringDisplayController.delegate = self;
[self presentModalViewController:videoFilteringDisplayController animated:YES];
}
- (void)finishedTestWithAverageTimesForCPU:(CGFloat)cpuTime coreImage:(CGFloat)coreImageTime gpuImage:(CGFloat)gpuImageTime;
{
[self dismissModalViewControllerAnimated:YES];
processingTimeForCPURoutine = cpuTime;
processingTimeForCoreImageRoutine = coreImageTime;
processingTimeForGPUImageRoutine = gpuImageTime;
[self.tableView reloadData];
}
@end
================================================
FILE: examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.h
================================================
#import
#import
#import "GPUImage.h"
@protocol VideoFilteringCallback;
@interface VideoFilteringDisplayController : UIViewController
{
CGFloat totalFrameTimeForCPU, totalFrameTimeForCoreImage, totalFrameTimeForGPUImage;
NSUInteger numberOfCPUFramesCaptured, numberOfCoreImageFramesCaptured, numberOfGPUImageFramesCaptured;
GLKView *videoDisplayView;
AVCaptureSession *captureSession;
AVCaptureDeviceInput *videoInput;
AVCaptureVideoDataOutput *videoOutput;
CIContext *coreImageContext;
CIFilter *coreImageFilter;
GLuint _renderBuffer;
BOOL processUsingCPU;
GPUImageVideoCamera *videoCamera;
GPUImageOutput *benchmarkedGPUImageFilter;
GPUImageView *filterView;
__unsafe_unretained id delegate;
}
@property(unsafe_unretained, nonatomic) id delegate;
@property (strong, nonatomic) EAGLContext *openGLESContext;
// Video filtering
- (void)startAVFoundationVideoProcessing;
- (void)displayVideoForCPU;
- (void)displayVideoForCoreImage;
- (void)displayVideoForGPUImage;
@end
@protocol VideoFilteringCallback
- (void)finishedTestWithAverageTimesForCPU:(CGFloat)cpuTime coreImage:(CGFloat)coreImageTime gpuImage:(CGFloat)gpuImageTime;
@end
================================================
FILE: examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.m
================================================
#import "VideoFilteringDisplayController.h"
#define BLURSIGMA 4.0
@implementation VideoFilteringDisplayController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
[self displayVideoForCPU];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
#pragma mark -
#pragma mark Video filtering
- (void)startAVFoundationVideoProcessing;
{
// Grab the back-facing camera
AVCaptureDevice *backFacingCamera = nil;
NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
for (AVCaptureDevice *device in devices)
{
if ([device position] == AVCaptureDevicePositionBack)
{
backFacingCamera = device;
}
}
// Create the capture session
captureSession = [[AVCaptureSession alloc] init];
// Add the video input
NSError *error = nil;
videoInput = [[AVCaptureDeviceInput alloc] initWithDevice:backFacingCamera error:&error];
if ([captureSession canAddInput:videoInput])
{
[captureSession addInput:videoInput];
}
// Add the video frame output
videoOutput = [[AVCaptureVideoDataOutput alloc] init];
[videoOutput setAlwaysDiscardsLateVideoFrames:YES];
// Use RGB frames instead of YUV to ease color processing
[videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]];
// dispatch_queue_t videoQueue = dispatch_queue_create("com.sunsetlakesoftware.colortracking.videoqueue", NULL);
// [videoOutput setSampleBufferDelegate:self queue:videoQueue];
[videoOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()];
if ([captureSession canAddOutput:videoOutput])
{
[captureSession addOutput:videoOutput];
}
else
{
NSLog(@"Couldn't add video output");
}
// [captureSession setSessionPreset:AVCaptureSessionPreset1280x720];
[captureSession setSessionPreset:AVCaptureSessionPreset640x480];
}
- (void)displayVideoForCPU;
{
NSLog(@"Start CPU Image");
totalFrameTimeForCPU = 0.0;
numberOfCPUFramesCaptured = 0;
[self startAVFoundationVideoProcessing];
processUsingCPU = YES;
[captureSession startRunning];
double delayInSeconds = 10.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[captureSession stopRunning];
// Remove view
captureSession = nil;
videoInput = nil;
videoOutput = nil;
NSLog(@"End CPU Image");
[self displayVideoForCoreImage];
});
}
- (void)displayVideoForCoreImage;
{
totalFrameTimeForCoreImage = 0.0;
numberOfCoreImageFramesCaptured = 0;
NSLog(@"Start Core Image");
self.openGLESContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
if (!self.openGLESContext) {
NSLog(@"Failed to create ES context");
}
[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];
glGenRenderbuffers(1, &_renderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _renderBuffer);
// videoDisplayView.context = self.openGLESContext;
// videoDisplayView.drawableDepthFormat = GLKViewDrawableDepthFormat24;
// [videoDisplayView bindDrawable];
// 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:@"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;
[captureSession startRunning];
double delayInSeconds = 10.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[captureSession stopRunning];
[videoDisplayView removeFromSuperview];
videoDisplayView = nil;
captureSession = nil;
videoInput = nil;
videoOutput = nil;
self.openGLESContext = nil;
glDeleteRenderbuffers(1, &_renderBuffer);
NSLog(@"End Core Image");
sleep(1);
[self displayVideoForGPUImage];
});
}
- (void)displayVideoForGPUImage;
{
totalFrameTimeForGPUImage = 0.0;
numberOfGPUImageFramesCaptured = 0;
NSLog(@"Start GPU Image");
videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack];
// videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1280x720 cameraPosition:AVCaptureDevicePositionBack];
videoCamera.runBenchmark = YES;
videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait;
// sepiaFilter = [[GPUImageSepiaFilter alloc] init];
// sepiaFilter = [[GPUImageiOSBlurFilter alloc] init];
// sepiaFilter = [[GPUImageGaussianBlurFilter alloc] init];
// [(GPUImageGaussianBlurFilter *)sepiaFilter setBlurRadiusInPixels:BLURSIGMA];
benchmarkedGPUImageFilter = [[GPUImageGammaFilter alloc] init];
[(GPUImageGammaFilter *)benchmarkedGPUImageFilter setGamma:0.75];
[videoCamera addTarget:benchmarkedGPUImageFilter];
filterView = [[GPUImageView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:filterView];
[benchmarkedGPUImageFilter addTarget:filterView];
[videoCamera startCameraCapture];
double delayInSeconds = 10.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[videoCamera stopCameraCapture];
[filterView removeFromSuperview];
filterView = nil;
captureSession = nil;
videoInput = nil;
videoOutput = nil;
NSLog(@"End GPU Image");
[delegate finishedTestWithAverageTimesForCPU:(totalFrameTimeForCPU * 1000.0 / numberOfCPUFramesCaptured) coreImage:(totalFrameTimeForCoreImage * 1000.0 / numberOfCoreImageFramesCaptured) gpuImage:[videoCamera averageFrameDurationDuringCapture]];
videoCamera = nil;
});
}
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
CVPixelBufferRef pixelBuffer = (CVPixelBufferRef)CMSampleBufferGetImageBuffer(sampleBuffer);
if (processUsingCPU)
{
// I only do the pixel processing here, not any upload to the view yet
// Still, this should be sufficient to get a conservative estimate of the performance of a CPU-bound filtering routine
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
CFAbsoluteTime elapsedTime, startTime = CFAbsoluteTimeGetCurrent();
unsigned char *data = (unsigned char *)CVPixelBufferGetBaseAddress(pixelBuffer);
size_t bufferHeight = CVPixelBufferGetHeight(pixelBuffer);
size_t bufferWidth = CVPixelBufferGetWidth(pixelBuffer);
NSInteger myDataLength = bufferWidth * bufferHeight * 4;
for (int i = 0; i < myDataLength; i+=4)
{
UInt8 r_pixel = data[i];
UInt8 g_pixel = data[i+1];
UInt8 b_pixel = data[i+2];
int outputRed = (r_pixel * .393) + (g_pixel *.769) + (b_pixel * .189);
int outputGreen = (r_pixel * .349) + (g_pixel *.686) + (b_pixel * .168);
int outputBlue = (r_pixel * .272) + (g_pixel *.534) + (b_pixel * .131);
if(outputRed>255)outputRed=255;
if(outputGreen>255)outputGreen=255;
if(outputBlue>255)outputBlue=255;
data[i] = outputRed;
data[i+1] = outputGreen;
data[i+2] = outputBlue;
}
elapsedTime = CFAbsoluteTimeGetCurrent() - startTime;
// NSLog(@"CPU frame time: %f", elapsedTime * 1000.0);
totalFrameTimeForCPU += elapsedTime;
numberOfCPUFramesCaptured++;
CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
}
else
{
CFAbsoluteTime elapsedTime, startTime = CFAbsoluteTimeGetCurrent();
CIImage *inputImage = [CIImage imageWithCVPixelBuffer:pixelBuffer];
inputImage = [inputImage imageByApplyingTransform:CGAffineTransformMakeRotation(-M_PI / 2.0)];
[coreImageFilter setValue:inputImage forKey:kCIInputImageKey];
CIImage *outputImage = [coreImageFilter outputImage];
// CGFloat scale = UIScreen.mainScreen.scale;
// CGRect s = CGRectMake(0, 0, [[UIScreen mainScreen] bounds].size.width * scale, [[UIScreen mainScreen] bounds].size.height * scale);
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;
// NSLog(@"Core Image frame time: %f", elapsedTime * 1000.0);
totalFrameTimeForCoreImage += elapsedTime;
numberOfCoreImageFramesCaptured++;
}
}
#pragma mark -
#pragma mark Accessors
@synthesize delegate;
@synthesize openGLESContext;
@end
================================================
FILE: examples/iOS/BenchmarkSuite/BenchmarkSuite/VideoFilteringDisplayController.xib
================================================
1280
11D50
2177
1138.32
568.00
com.apple.InterfaceBuilder.IBCocoaTouchPlugin
1173
IBProxyObject
IBUIView
com.apple.InterfaceBuilder.IBCocoaTouchPlugin
PluginDependencyRecalculationVersion
IBFilesOwner
IBCocoaTouchFramework
IBFirstResponder
IBCocoaTouchFramework
274
{{0, 20}, {320, 460}}
3
MQA
2
IBCocoaTouchFramework
view
3
0
1
-1
File's Owner
-2
VideoFilteringDisplayController
com.apple.InterfaceBuilder.IBCocoaTouchPlugin
UIResponder
com.apple.InterfaceBuilder.IBCocoaTouchPlugin
com.apple.InterfaceBuilder.IBCocoaTouchPlugin
3
VideoFilteringDisplayController
UIViewController
IBProjectSource
./Classes/VideoFilteringDisplayController.h
0
IBCocoaTouchFramework
YES
3
1173
================================================
FILE: examples/iOS/BenchmarkSuite/BenchmarkSuite/en.lproj/InfoPlist.strings
================================================
/* Localized versions of Info.plist keys */
================================================
FILE: examples/iOS/BenchmarkSuite/BenchmarkSuite/main.m
================================================
#import
#import "BenchmarkAppDelegate.h"
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([BenchmarkAppDelegate class]));
}
}
================================================
FILE: examples/iOS/BenchmarkSuite/BenchmarkSuite.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* 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 */; };
BCF9D16514EAD24200986461 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = BCF9D16314EAD24200986461 /* InfoPlist.strings */; };
BCF9D16714EAD24200986461 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF9D16614EAD24200986461 /* main.m */; };
BCF9D16B14EAD24200986461 /* BenchmarkAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF9D16A14EAD24200986461 /* BenchmarkAppDelegate.m */; };
BCF9D17414EAD33A00986461 /* BenchmarkTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF9D17214EAD33A00986461 /* BenchmarkTableViewController.m */; };
BCF9D17514EAD33A00986461 /* BenchmarkTableViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCF9D17314EAD33A00986461 /* BenchmarkTableViewController.xib */; };
BCF9D17914EAD5C900986461 /* VideoFilteringBenchmarkController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF9D17714EAD5C900986461 /* VideoFilteringBenchmarkController.m */; };
BCF9D17E14EAD5F900986461 /* VideoFilteringDisplayController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF9D17C14EAD5F900986461 /* VideoFilteringDisplayController.m */; };
BCF9D17F14EAD5F900986461 /* VideoFilteringDisplayController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCF9D17D14EAD5F900986461 /* VideoFilteringDisplayController.xib */; };
BCF9D19914EC29FA00986461 /* 41-picture-frame.png in Resources */ = {isa = PBXBuildFile; fileRef = BCF9D19314EC29FA00986461 /* 41-picture-frame.png */; };
BCF9D19A14EC29FA00986461 /* 41-picture-frame@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BCF9D19414EC29FA00986461 /* 41-picture-frame@2x.png */; };
BCF9D19B14EC29FA00986461 /* 46-movie-2.png in Resources */ = {isa = PBXBuildFile; fileRef = BCF9D19514EC29FA00986461 /* 46-movie-2.png */; };
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 */; };
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 */; };
BCF9D1E114EC4F7300986461 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF9D1E014EC4F7300986461 /* OpenGLES.framework */; };
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 */
BCF866D61725A2D800912E34 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BCF9D1CA14EC4F3F00986461 /* GPUImage.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = BCF1A33414DDB1EC00852800;
remoteInfo = GPUImage;
};
BCF866D81725A2D800912E34 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BCF9D1CA14EC4F3F00986461 /* GPUImage.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = BCF1A34414DDB1EC00852800;
remoteInfo = GPUImageTests;
};
BCF866DA1725A2E400912E34 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BCF9D1CA14EC4F3F00986461 /* GPUImage.xcodeproj */;
proxyType = 1;
remoteGlobalIDString = BCF1A33314DDB1EC00852800;
remoteInfo = GPUImage;
};
/* End PBXContainerItemProxy section */
/* 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; };
BCF9D15A14EAD24200986461 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
BCF9D15C14EAD24200986461 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
BCF9D15E14EAD24200986461 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
BCF9D16214EAD24200986461 /* BenchmarkSuite-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "BenchmarkSuite-Info.plist"; sourceTree = ""; };
BCF9D16414EAD24200986461 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; };
BCF9D16614EAD24200986461 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
BCF9D16814EAD24200986461 /* BenchmarkSuite-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "BenchmarkSuite-Prefix.pch"; sourceTree = ""; };
BCF9D16914EAD24200986461 /* BenchmarkAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BenchmarkAppDelegate.h; sourceTree = ""; };
BCF9D16A14EAD24200986461 /* BenchmarkAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BenchmarkAppDelegate.m; sourceTree = ""; };
BCF9D17114EAD33A00986461 /* BenchmarkTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BenchmarkTableViewController.h; sourceTree = ""; };
BCF9D17214EAD33A00986461 /* BenchmarkTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BenchmarkTableViewController.m; sourceTree = ""; };
BCF9D17314EAD33A00986461 /* BenchmarkTableViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BenchmarkTableViewController.xib; sourceTree = ""; };
BCF9D17614EAD5C900986461 /* VideoFilteringBenchmarkController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoFilteringBenchmarkController.h; sourceTree = ""; };
BCF9D17714EAD5C900986461 /* VideoFilteringBenchmarkController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VideoFilteringBenchmarkController.m; sourceTree = ""; };
BCF9D17B14EAD5F900986461 /* VideoFilteringDisplayController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoFilteringDisplayController.h; sourceTree = ""; };
BCF9D17C14EAD5F900986461 /* VideoFilteringDisplayController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VideoFilteringDisplayController.m; sourceTree = ""; };
BCF9D17D14EAD5F900986461 /* VideoFilteringDisplayController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = VideoFilteringDisplayController.xib; sourceTree = ""; };
BCF9D19314EC29FA00986461 /* 41-picture-frame.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "41-picture-frame.png"; sourceTree = ""; };
BCF9D19414EC29FA00986461 /* 41-picture-frame@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "41-picture-frame@2x.png"; sourceTree = ""; };
BCF9D19514EC29FA00986461 /* 46-movie-2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "46-movie-2.png"; sourceTree = ""; };
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 = ""; };
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; };
BCF9D1E014EC4F7300986461 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; };
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 */
BCF9D15314EAD24200986461 /* Frameworks */ = {
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 */,
BCF9D1E114EC4F7300986461 /* OpenGLES.framework in Frameworks */,
BCF9D1DD14EC4F6C00986461 /* CoreMedia.framework in Frameworks */,
BCF9D1DE14EC4F6C00986461 /* CoreVideo.framework in Frameworks */,
BCF9D1DF14EC4F6C00986461 /* QuartzCore.framework in Frameworks */,
BCF9D15B14EAD24200986461 /* UIKit.framework in Frameworks */,
BCF9D15D14EAD24200986461 /* Foundation.framework in Frameworks */,
BCF9D15F14EAD24200986461 /* CoreGraphics.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
BCF866D11725A2D800912E34 /* Products */ = {
isa = PBXGroup;
children = (
BCF866D71725A2D800912E34 /* libGPUImage.a */,
BCF866D91725A2D800912E34 /* GPUImageTests.octest */,
);
name = Products;
sourceTree = "