Skip to content

Commit 70e1092

Browse files
committed
Update to Filter Showcase
I have added the new filters to the Mac Filter Showcase.
1 parent a8f6fc0 commit 70e1092

File tree

4 files changed

+157
-153
lines changed

4 files changed

+157
-153
lines changed

examples/Mac/FilterShowcase/FilterShowcase/FilterOperationTypes.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ protocol FilterOperationInterface {
2626
func updateBasedOnSliderValue(_ sliderValue:Float)
2727
}
2828

29-
class FilterOperation<FilterClass: ImageProcessingOperation>: FilterOperationInterface {
29+
class FilterOperation<FilterClass: GPUImage.ImageProcessingOperation>: FilterOperationInterface {
3030
lazy var internalFilter:FilterClass = {
3131
return self.filterCreationFunction()
3232
}()

examples/Mac/FilterShowcase/FilterShowcase/FilterOperations.swift

Lines changed: 153 additions & 152 deletions
Original file line numberDiff line numberDiff line change
@@ -257,16 +257,16 @@ let filterOperations: Array<FilterOperationInterface> = [
257257
sliderUpdateCallback: nil,
258258
filterOperationType:.singleInput
259259
),
260-
// FilterOperation(
261-
// filter:{Solarize()},
262-
// listName:"Solarize",
263-
// titleName:"Solarize",
264-
// sliderConfiguration:.enabled(minimumValue:0.0, maximumValue:1.0, initialValue:0.5),
265-
// sliderUpdateCallback: {(filter, sliderValue) in
266-
// filter.threshold = sliderValue
267-
// },
268-
// filterOperationType:.singleInput
269-
// ),
260+
FilterOperation(
261+
filter:{Solarize()},
262+
listName:"Solarize",
263+
titleName:"Solarize",
264+
sliderConfiguration:.enabled(minimumValue:0.0, maximumValue:1.0, initialValue:0.5),
265+
sliderUpdateCallback: {(filter, sliderValue) in
266+
filter.threshold = sliderValue
267+
},
268+
filterOperationType:.singleInput
269+
),
270270
FilterOperation(
271271
filter:{Vibrance()},
272272
listName:"Vibrance",
@@ -451,26 +451,26 @@ let filterOperations: Array<FilterOperationInterface> = [
451451
// },
452452
// filterOperationType:.singleInput
453453
// ),
454-
// FilterOperation(
455-
// filter:{Crosshatch()},
456-
// listName:"Crosshatch",
457-
// titleName:"Crosshatch",
458-
// sliderConfiguration:.enabled(minimumValue:0.01, maximumValue:0.06, initialValue:0.03),
459-
// sliderUpdateCallback: {(filter, sliderValue) in
460-
// filter.crossHatchSpacing = sliderValue
461-
// },
462-
// filterOperationType:.singleInput
463-
// ),
464-
// FilterOperation(
465-
// filter:{SobelEdgeDetection()},
466-
// listName:"Sobel edge detection",
467-
// titleName:"Sobel Edge Detection",
468-
// sliderConfiguration:.enabled(minimumValue:0.0, maximumValue:1.0, initialValue:0.25),
469-
// sliderUpdateCallback: {(filter, sliderValue) in
470-
// filter.edgeStrength = sliderValue
471-
// },
472-
// filterOperationType:.singleInput
473-
// ),
454+
FilterOperation(
455+
filter:{Crosshatch()},
456+
listName:"Crosshatch",
457+
titleName:"Crosshatch",
458+
sliderConfiguration:.enabled(minimumValue:0.01, maximumValue:0.06, initialValue:0.03),
459+
sliderUpdateCallback: {(filter, sliderValue) in
460+
filter.crossHatchSpacing = sliderValue
461+
},
462+
filterOperationType:.singleInput
463+
),
464+
FilterOperation(
465+
filter:{SobelEdgeDetection()},
466+
listName:"Sobel edge detection",
467+
titleName:"Sobel Edge Detection",
468+
sliderConfiguration:.enabled(minimumValue:0.0, maximumValue:1.0, initialValue:0.25),
469+
sliderUpdateCallback: {(filter, sliderValue) in
470+
filter.edgeStrength = sliderValue
471+
},
472+
filterOperationType:.singleInput
473+
),
474474
// FilterOperation(
475475
// filter:{PrewittEdgeDetection()},
476476
// listName:"Prewitt edge detection",
@@ -491,16 +491,16 @@ let filterOperations: Array<FilterOperationInterface> = [
491491
// },
492492
// filterOperationType:.singleInput
493493
// ),
494-
// FilterOperation(
495-
// filter:{ThresholdSobelEdgeDetection()},
496-
// listName:"Threshold edge detection",
497-
// titleName:"Threshold Edge Detection",
498-
// sliderConfiguration:.enabled(minimumValue:0.0, maximumValue:1.0, initialValue:0.25),
499-
// sliderUpdateCallback: {(filter, sliderValue) in
500-
// filter.threshold = sliderValue
501-
// },
502-
// filterOperationType:.singleInput
503-
// ),
494+
FilterOperation(
495+
filter:{ThresholdSobelEdgeDetection()},
496+
listName:"Threshold edge detection",
497+
titleName:"Threshold Edge Detection",
498+
sliderConfiguration:.enabled(minimumValue:0.0, maximumValue:1.0, initialValue:0.25),
499+
sliderUpdateCallback: {(filter, sliderValue) in
500+
filter.threshold = sliderValue
501+
},
502+
filterOperationType:.singleInput
503+
),
504504
// FilterOperation(
505505
// filter:{HarrisCornerDetector()},
506506
// listName:"Harris corner detector",
@@ -625,34 +625,34 @@ let filterOperations: Array<FilterOperationInterface> = [
625625
// ),
626626
// // TODO: Motion detector
627627
//
628-
// FilterOperation(
629-
// filter:{SketchFilter()},
630-
// listName:"Sketch",
631-
// titleName:"Sketch",
632-
// sliderConfiguration:.enabled(minimumValue:0.0, maximumValue:1.0, initialValue:0.5),
633-
// sliderUpdateCallback: {(filter, sliderValue) in
634-
// filter.edgeStrength = sliderValue
635-
// },
636-
// filterOperationType:.singleInput
637-
// ),
638-
// FilterOperation(
639-
// filter:{ThresholdSketchFilter()},
640-
// listName:"Threshold Sketch",
641-
// titleName:"Threshold Sketch",
642-
// sliderConfiguration:.enabled(minimumValue:0.0, maximumValue:1.0, initialValue:0.25),
643-
// sliderUpdateCallback: {(filter, sliderValue) in
644-
// filter.threshold = sliderValue
645-
// },
646-
// filterOperationType:.singleInput
647-
// ),
648-
// FilterOperation(
649-
// filter:{ToonFilter()},
650-
// listName:"Toon",
651-
// titleName:"Toon",
652-
// sliderConfiguration:.disabled,
653-
// sliderUpdateCallback: nil,
654-
// filterOperationType:.singleInput
655-
// ),
628+
FilterOperation(
629+
filter:{SketchFilter()},
630+
listName:"Sketch",
631+
titleName:"Sketch",
632+
sliderConfiguration:.enabled(minimumValue:0.0, maximumValue:1.0, initialValue:0.5),
633+
sliderUpdateCallback: {(filter, sliderValue) in
634+
filter.edgeStrength = sliderValue
635+
},
636+
filterOperationType:.singleInput
637+
),
638+
FilterOperation(
639+
filter:{ThresholdSketchFilter()},
640+
listName:"Threshold Sketch",
641+
titleName:"Threshold Sketch",
642+
sliderConfiguration:.enabled(minimumValue:0.0, maximumValue:1.0, initialValue:0.25),
643+
sliderUpdateCallback: {(filter, sliderValue) in
644+
filter.threshold = sliderValue
645+
},
646+
filterOperationType:.singleInput
647+
),
648+
FilterOperation(
649+
filter:{ToonFilter()},
650+
listName:"Toon",
651+
titleName:"Toon",
652+
sliderConfiguration:.disabled,
653+
sliderUpdateCallback: nil,
654+
filterOperationType:.singleInput
655+
),
656656
// FilterOperation(
657657
// filter:{SmoothToonFilter()},
658658
// listName:"Smooth toon",
@@ -674,21 +674,22 @@ let filterOperations: Array<FilterOperationInterface> = [
674674
// },
675675
// filterOperationType:.singleInput
676676
// ),
677+
FilterOperation(
678+
filter:{CGAColorspaceFilter()},
679+
listName:"CGA colorspace",
680+
titleName:"CGA Colorspace",
681+
sliderConfiguration:.disabled,
682+
sliderUpdateCallback: nil,
683+
filterOperationType:.singleInput
684+
),
677685
// FilterOperation(
678-
// filter:{CGAColorspaceFilter()},
679-
// listName:"CGA colorspace",
680-
// titleName:"CGA Colorspace",
681-
// sliderConfiguration:.disabled,
682-
// sliderUpdateCallback: nil,
683-
// filterOperationType:.singleInput
684-
// ),
685-
// FilterOperation(
686-
// filter:{Posterize()},
686+
// filter:{() -> GPUImage.Posterize in
687+
// return GPUImage.Posterize()},
687688
// listName:"Posterize",
688689
// titleName:"Posterize",
689690
// sliderConfiguration:.enabled(minimumValue:1.0, maximumValue:20.0, initialValue:10.0),
690691
// sliderUpdateCallback: {(filter, sliderValue) in
691-
// filter.colorLevels = round(sliderValue)
692+
// (filter as! GPUImage.Posterize).colorLevels = round(Float(sliderValue))
692693
// },
693694
// filterOperationType:.singleInput
694695
// ),
@@ -721,36 +722,36 @@ let filterOperations: Array<FilterOperationInterface> = [
721722
// },
722723
// filterOperationType:.singleInput
723724
// ),
724-
// FilterOperation(
725-
// filter:{Laplacian()},
726-
// listName:"Laplacian",
727-
// titleName:"Laplacian",
728-
// sliderConfiguration:.disabled,
729-
// sliderUpdateCallback: nil,
730-
// filterOperationType:.singleInput
731-
// ),
732-
// FilterOperation(
733-
// filter:{ChromaKeying()},
734-
// listName:"Chroma key",
735-
// titleName:"Chroma Key",
736-
// sliderConfiguration:.enabled(minimumValue:0.0, maximumValue:1.00, initialValue:0.40),
737-
// sliderUpdateCallback: {(filter, sliderValue) in
738-
// filter.thresholdSensitivity = sliderValue
739-
// },
740-
// filterOperationType:.custom(filterSetupFunction:{(camera, filter, outputView) in
741-
// let castFilter = filter as! ChromaKeying
742-
//
743-
// let blendFilter = AlphaBlend()
744-
// blendFilter.mix = 1.0
745-
//
746-
// let inputImage = PictureInput(imageName:blendImageName)
747-
//
748-
// inputImage --> blendFilter
749-
// camera --> castFilter --> blendFilter --> outputView
750-
// inputImage.processImage()
751-
// return blendFilter
752-
// })
753-
// ),
725+
FilterOperation(
726+
filter:{Laplacian()},
727+
listName:"Laplacian",
728+
titleName:"Laplacian",
729+
sliderConfiguration:.disabled,
730+
sliderUpdateCallback: nil,
731+
filterOperationType:.singleInput
732+
),
733+
FilterOperation(
734+
filter:{ChromaKeying()},
735+
listName:"Chroma key",
736+
titleName:"Chroma Key",
737+
sliderConfiguration:.enabled(minimumValue:0.0, maximumValue:1.00, initialValue:0.40),
738+
sliderUpdateCallback: {(filter, sliderValue) in
739+
filter.thresholdSensitivity = sliderValue
740+
},
741+
filterOperationType:.custom(filterSetupFunction:{(camera, filter, outputView) in
742+
let castFilter = filter as! ChromaKeying
743+
744+
let blendFilter = AlphaBlend()
745+
blendFilter.mix = 1.0
746+
747+
let inputImage = PictureInput(imageName:blendImageName)
748+
749+
inputImage --> blendFilter
750+
camera --> castFilter --> blendFilter --> outputView
751+
inputImage.processImage()
752+
return blendFilter
753+
})
754+
),
754755
// FilterOperation(
755756
// filter:{KuwaharaFilter()},
756757
// listName:"Kuwahara",
@@ -827,16 +828,16 @@ let filterOperations: Array<FilterOperationInterface> = [
827828
// },
828829
// filterOperationType:.singleInput
829830
// ),
830-
// FilterOperation(
831-
// filter:{ZoomBlur()},
832-
// listName:"Zoom blur",
833-
// titleName:"Zoom Blur",
834-
// sliderConfiguration:.enabled(minimumValue:0.0, maximumValue:2.5, initialValue:1.0),
835-
// sliderUpdateCallback: {(filter, sliderValue) in
836-
// filter.blurSize = sliderValue
837-
// },
838-
// filterOperationType:.singleInput
839-
// ),
831+
FilterOperation(
832+
filter:{ZoomBlur()},
833+
listName:"Zoom blur",
834+
titleName:"Zoom Blur",
835+
sliderConfiguration:.enabled(minimumValue:0.0, maximumValue:2.5, initialValue:1.0),
836+
sliderUpdateCallback: {(filter, sliderValue) in
837+
filter.blurSize = sliderValue
838+
},
839+
filterOperationType:.singleInput
840+
),
840841
// FilterOperation( // TODO: Make this only partially applied to the view
841842
// filter:{iOSBlur()},
842843
// listName:"iOS 7 blur",
@@ -845,16 +846,16 @@ let filterOperations: Array<FilterOperationInterface> = [
845846
// sliderUpdateCallback: nil,
846847
// filterOperationType:.singleInput
847848
// ),
848-
// FilterOperation(
849-
// filter:{SwirlDistortion()},
850-
// listName:"Swirl",
851-
// titleName:"Swirl",
852-
// sliderConfiguration:.enabled(minimumValue:0.0, maximumValue:2.0, initialValue:1.0),
853-
// sliderUpdateCallback: {(filter, sliderValue) in
854-
// filter.angle = sliderValue
855-
// },
856-
// filterOperationType:.singleInput
857-
// ),
849+
FilterOperation(
850+
filter:{SwirlDistortion()},
851+
listName:"Swirl",
852+
titleName:"Swirl",
853+
sliderConfiguration:.enabled(minimumValue:0.0, maximumValue:2.0, initialValue:1.0),
854+
sliderUpdateCallback: {(filter, sliderValue) in
855+
filter.angle = sliderValue
856+
},
857+
filterOperationType:.singleInput
858+
),
858859
// FilterOperation(
859860
// filter:{BulgeDistortion()},
860861
// listName:"Bulge",
@@ -924,14 +925,14 @@ let filterOperations: Array<FilterOperationInterface> = [
924925
// return blendFilter
925926
// })
926927
// ),
927-
// FilterOperation (
928-
// filter:{StretchDistortion()},
929-
// listName:"Stretch",
930-
// titleName:"Stretch",
931-
// sliderConfiguration:.disabled,
932-
// sliderUpdateCallback: nil,
933-
// filterOperationType:.singleInput
934-
// ),
928+
FilterOperation (
929+
filter:{StretchDistortion()},
930+
listName:"Stretch",
931+
titleName:"Stretch",
932+
sliderConfiguration:.disabled,
933+
sliderUpdateCallback: nil,
934+
filterOperationType:.singleInput
935+
),
935936
// FilterOperation(
936937
// filter:{Dilation()},
937938
// listName:"Dilation",
@@ -967,22 +968,22 @@ let filterOperations: Array<FilterOperationInterface> = [
967968
// // TODO: Perlin noise
968969
// // TODO: JFAVoronoi
969970
// // TODO: Mosaic
970-
// FilterOperation(
971-
// filter:{LocalBinaryPattern()},
972-
// listName:"Local binary pattern",
973-
// titleName:"Local Binary Pattern",
974-
// sliderConfiguration:.disabled,
975-
// sliderUpdateCallback:nil,
976-
// filterOperationType:.singleInput
977-
// ),
978-
// FilterOperation(
979-
// filter:{ColorLocalBinaryPattern()},
980-
// listName:"Local binary pattern (color)",
981-
// titleName:"Local Binary Pattern (Color)",
982-
// sliderConfiguration:.disabled,
983-
// sliderUpdateCallback:nil,
984-
// filterOperationType:.singleInput
985-
// ),
971+
FilterOperation(
972+
filter:{LocalBinaryPattern()},
973+
listName:"Local binary pattern",
974+
titleName:"Local Binary Pattern",
975+
sliderConfiguration:.disabled,
976+
sliderUpdateCallback:nil,
977+
filterOperationType:.singleInput
978+
),
979+
FilterOperation(
980+
filter:{ColorLocalBinaryPattern()},
981+
listName:"Local binary pattern (color)",
982+
titleName:"Local Binary Pattern (Color)",
983+
sliderConfiguration:.disabled,
984+
sliderUpdateCallback:nil,
985+
filterOperationType:.singleInput
986+
),
986987
FilterOperation(
987988
filter:{DissolveBlend()},
988989
listName:"Dissolve blend",

examples/Mac/FilterShowcase/FilterShowcase/Info.plist

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
<string>1</string>
2525
<key>LSMinimumSystemVersion</key>
2626
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
27+
<key>NSCameraUsageDescription</key>
28+
<string>This application uses the camera to display a filtered video feed.</string>
2729
<key>NSHumanReadableCopyright</key>
2830
<string>Copyright © 2016 Sunset Lake Software LLC. All rights reserved.</string>
2931
<key>NSMainNibFile</key>

0 commit comments

Comments
 (0)