diff --git a/imagepipeline/src/main/java/com/facebook/imagepipeline/filter/InPlaceEllipseRoundFilter.java b/imagepipeline/src/main/java/com/facebook/imagepipeline/filter/InPlaceEllipseRoundFilter.java new file mode 100644 index 0000000000..f8d13e524d --- /dev/null +++ b/imagepipeline/src/main/java/com/facebook/imagepipeline/filter/InPlaceEllipseRoundFilter.java @@ -0,0 +1,45 @@ +package com.facebook.imagepipeline.filter; + +import android.graphics.Bitmap; +import com.facebook.common.internal.Preconditions; +import com.facebook.imageutils.BitmapUtil; + +/** + * Filter for rounding to ellipse. + */ +public final class InPlaceEllipseRoundFilter { + + private InPlaceEllipseRoundFilter() {} + + /** + * An implementation for rounding a given bitmap to an ellipse shape. + * + * @param bitmap The input {@link Bitmap} + */ + public static void roundEllipseBitmapInPlace(Bitmap bitmap) { + Preconditions.checkNotNull(bitmap); + final int w = bitmap.getWidth(); + final int h = bitmap.getHeight(); + + final int[] transparentColor = new int[w]; + + final int[] pixels = new int[w*h]; + bitmap.getPixels(pixels, 0, w, 0, 0, w, h); + + for (int y = -1*h/2; y < h/2; y++) { + int x = -1*w/2; + while ( ((float) 4*x*x)/(w*w) + ((float) 4*y*y)/(h*h) > 1 ) { + x++; + } + + int pixelsToHide = Math.max(0, x + w/2 - 1); + + System.arraycopy(transparentColor, 0, pixels, (y + h/2)*w, pixelsToHide); + + System.arraycopy(transparentColor, 0, pixels, (y + h/2)*w + w - pixelsToHide, pixelsToHide); + } + + bitmap.setPixels(pixels, 0, w, 0, 0, w, h); + } +} + diff --git a/imagepipeline/src/main/java/com/facebook/imagepipeline/postprocessors/EllipsePostprocessor.java b/imagepipeline/src/main/java/com/facebook/imagepipeline/postprocessors/EllipsePostprocessor.java new file mode 100644 index 0000000000..ad8b66952f --- /dev/null +++ b/imagepipeline/src/main/java/com/facebook/imagepipeline/postprocessors/EllipsePostprocessor.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.imagepipeline.postprocessors; + +import android.graphics.Bitmap; +import com.facebook.cache.common.CacheKey; +import com.facebook.cache.common.SimpleCacheKey; +import com.facebook.imagepipeline.filter.InPlaceEllipseRoundFilter; +import com.facebook.imagepipeline.request.BasePostprocessor; +import javax.annotation.Nullable; + +/** Postprocessor that rounds a given image as a ellipse using non-native code. */ +public class EllipsePostprocessor extends BasePostprocessor { + + private @Nullable CacheKey mCacheKey; + + public EllipsePostprocessor() {;} + + @Override + public void process(Bitmap bitmap) { + InPlaceEllipseRoundFilter.roundEllipseBitmapInPlace(bitmap); + } + + @Nullable + @Override + public CacheKey getPostprocessorCacheKey() { + if (mCacheKey == null) { + mCacheKey = new SimpleCacheKey("InPlaceEllipseRoundFilter"); + } + return mCacheKey; + } +} diff --git a/samples/showcase/src/main/java/com/facebook/fresco/samples/showcase/imagepipeline/ImagePipelinePostProcessorFragment.java b/samples/showcase/src/main/java/com/facebook/fresco/samples/showcase/imagepipeline/ImagePipelinePostProcessorFragment.java index 75e04f4487..1a595298d0 100644 --- a/samples/showcase/src/main/java/com/facebook/fresco/samples/showcase/imagepipeline/ImagePipelinePostProcessorFragment.java +++ b/samples/showcase/src/main/java/com/facebook/fresco/samples/showcase/imagepipeline/ImagePipelinePostProcessorFragment.java @@ -34,6 +34,7 @@ import com.facebook.fresco.samples.showcase.postprocessor.SlowGreyScalePostprocessor; import com.facebook.fresco.samples.showcase.postprocessor.WatermarkPostprocessor; import com.facebook.imagepipeline.postprocessors.BlurPostProcessor; +import com.facebook.imagepipeline.postprocessors.EllipsePostprocessor; import com.facebook.imagepipeline.postprocessors.IterativeBoxBlurPostProcessor; import com.facebook.imagepipeline.postprocessors.RoundAsCirclePostprocessor; import com.facebook.imagepipeline.postprocessors.RoundPostprocessor; @@ -212,6 +213,10 @@ this, new RoundAsCirclePostprocessor(true))), R.string.imagepipeline_postprocessor_set_rounded_corners, new BenchmarkPostprocessorForDuplicatedBitmapInPlace( this, new RoundedCornersPostprocessor())), + new Entry( + R.string.imagepipeline_postprocessor_set_ellipse, + new BenchmarkPostprocessorForDuplicatedBitmapInPlace( + this, new EllipsePostprocessor())), new Entry( R.string.imagepipeline_postprocessor_set_round_as_circle, new BenchmarkPostprocessorForDuplicatedBitmap(this, new RoundPostprocessor()))); diff --git a/samples/showcase/src/main/res/values/strings.xml b/samples/showcase/src/main/res/values/strings.xml index 0f5cf513bf..79e3199f65 100644 --- a/samples/showcase/src/main/res/values/strings.xml +++ b/samples/showcase/src/main/res/values/strings.xml @@ -74,6 +74,7 @@ Round As Circle Post-Processor Antialiased Circle Post-Processor Rounded Corners Post-Processor + Ellipse Post-Processor Refresh Prefetch