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