From 7d1f7592a01aa446507654cb620f8ae79d51c6a5 Mon Sep 17 00:00:00 2001 From: Brad Larson Date: Mon, 28 Jan 2013 19:54:54 -0600 Subject: [PATCH] Fixed the Lanczos resampling filter. --- .../ShowcaseFilterViewController.m | 3 +- .../Source/GPUImageLanczosResamplingFilter.m | 33 +++++++++++++++++++ framework/Source/GPUImageTwoPassFilter.m | 7 ++-- 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m index f014ccebe..4f95a9207 100755 --- a/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m +++ b/examples/FilterShowcase/FilterShowcase/ShowcaseFilterViewController.m @@ -1506,7 +1506,8 @@ - (IBAction)updateFilterFromSlider:(id)sender; case GPUIMAGE_MOSAIC: [(GPUImageMosaicFilter *)filter setDisplayTileSize:CGSizeMake([(UISlider *)sender value], [(UISlider *)sender value])]; break; case GPUIMAGE_VIGNETTE: [(GPUImageVignetteFilter *)filter setVignetteEnd:[(UISlider *)sender value]]; break; case GPUIMAGE_GAUSSIAN: [(GPUImageGaussianBlurFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; - case GPUIMAGE_BILATERAL: [(GPUImageBilateralFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; +// case GPUIMAGE_BILATERAL: [(GPUImageBilateralFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; + case GPUIMAGE_BILATERAL: [(GPUImageBilateralFilter *)filter setDistanceNormalizationFactor:[(UISlider*)sender value]]; break; case GPUIMAGE_FASTBLUR: [(GPUImageFastBlurFilter *)filter setBlurPasses:round([(UISlider*)sender value])]; break; // case GPUIMAGE_FASTBLUR: [(GPUImageFastBlurFilter *)filter setBlurSize:[(UISlider*)sender value]]; break; case GPUIMAGE_OPACITY: [(GPUImageOpacityFilter *)filter setOpacity:[(UISlider *)sender value]]; break; diff --git a/framework/Source/GPUImageLanczosResamplingFilter.m b/framework/Source/GPUImageLanczosResamplingFilter.m index 4c5658d31..24c6dd56f 100644 --- a/framework/Source/GPUImageLanczosResamplingFilter.m +++ b/framework/Source/GPUImageLanczosResamplingFilter.m @@ -123,4 +123,37 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; }); } +// The first pass (vertical) of the resampling needs to be shrunk in only one dimension so that the remaining shrinkage can be performed in the horizonal pass +- (void)setFilterFBO; +{ + CGSize currentFBOSize = [self sizeOfFBO]; + if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) + { + currentFBOSize.height = self.originalImageSize.height; + } + else + { + currentFBOSize.width = self.originalImageSize.width; + } + + if (!filterFramebuffer) + { + if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) + { + preparedToCaptureImage = NO; + [super createFilterFBOofSize:currentFBOSize]; + preparedToCaptureImage = YES; + } + else + { + [super createFilterFBOofSize:currentFBOSize]; + } + [self setupFilterForSize:currentFBOSize]; + } + + glBindFramebuffer(GL_FRAMEBUFFER, filterFramebuffer); + + glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); +} + @end diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index 4f20cd453..27ef39e5f 100755 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -271,9 +271,10 @@ - (void)destroyFilterFBO; - (void)setFilterFBO; { + CGSize currentFBOSize = [self sizeOfFBO]; + if (!filterFramebuffer) { - CGSize currentFBOSize = [self sizeOfFBO]; if ([GPUImageOpenGLESContext supportsFastTextureUpload] && preparedToCaptureImage) { preparedToCaptureImage = NO; @@ -289,7 +290,6 @@ - (void)setFilterFBO; glBindFramebuffer(GL_FRAMEBUFFER, filterFramebuffer); - CGSize currentFBOSize = [self sizeOfFBO]; glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); } @@ -305,9 +305,6 @@ - (void)setSecondFilterFBO; glBindFramebuffer(GL_FRAMEBUFFER, secondFilterFramebuffer); CGSize currentFBOSize = [self sizeOfFBO]; glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); - -// CGSize currentFBOSize = [self sizeOfFBO]; -// glViewport(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height); } - (void)setOutputFBO;