From 0aea24227a4bf37a63bedfbbea7a8fbe4003d98a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 12 Aug 2023 16:46:47 +1000 Subject: [PATCH] Improve efficiency when a radius is zero --- src/PIL/ImageFilter.py | 4 ++++ src/libImaging/BoxBlur.c | 42 ++++++++++++++++++++++++---------------- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/src/PIL/ImageFilter.py b/src/PIL/ImageFilter.py index 0d2fec9ee78..57268b8f53d 100644 --- a/src/PIL/ImageFilter.py +++ b/src/PIL/ImageFilter.py @@ -170,6 +170,8 @@ def filter(self, image): xy = self.radius if not isinstance(xy, (tuple, list)): xy = (xy, xy) + if xy == (0, 0): + return image.copy() return image.gaussian_blur(xy) @@ -202,6 +204,8 @@ def filter(self, image): xy = self.radius if not isinstance(xy, (tuple, list)): xy = (xy, xy) + if xy == (0, 0): + return image.copy() return image.box_blur(xy) diff --git a/src/libImaging/BoxBlur.c b/src/libImaging/BoxBlur.c index 41e9fbed9cb..a4006dd0a20 100644 --- a/src/libImaging/BoxBlur.c +++ b/src/libImaging/BoxBlur.c @@ -258,29 +258,37 @@ ImagingBoxBlur(Imaging imOut, Imaging imIn, float xradius, float yradius, int n) return ImagingError_ModeError(); } - imTransposed = ImagingNewDirty(imIn->mode, imIn->ysize, imIn->xsize); - if (!imTransposed) { - return NULL; - } - /* Apply blur in one dimension. Use imOut as a destination at first pass, then use imOut as a source too. */ - ImagingHorizontalBoxBlur(imOut, imIn, xradius); - for (i = 1; i < n; i++) { - ImagingHorizontalBoxBlur(imOut, imOut, xradius); - } - /* Transpose result for blur in another direction. */ - ImagingTranspose(imTransposed, imOut); - /* Reuse imTransposed as a source and destination there. */ - for (i = 0; i < n; i++) { - ImagingHorizontalBoxBlur(imTransposed, imTransposed, yradius); + if (xradius != 0) { + ImagingHorizontalBoxBlur(imOut, imIn, xradius); + for (i = 1; i < n; i++) { + ImagingHorizontalBoxBlur(imOut, imOut, xradius); + } } - /* Restore original orientation. */ - ImagingTranspose(imOut, imTransposed); + if (yradius != 0) { + imTransposed = ImagingNewDirty(imIn->mode, imIn->ysize, imIn->xsize); + if (!imTransposed) { + return NULL; + } - ImagingDelete(imTransposed); + /* Transpose result for blur in another direction. */ + ImagingTranspose(imTransposed, xradius == 0 ? imIn : imOut); + + /* Reuse imTransposed as a source and destination there. */ + for (i = 0; i < n; i++) { + ImagingHorizontalBoxBlur(imTransposed, imTransposed, yradius); + } + /* Restore original orientation. */ + ImagingTranspose(imOut, imTransposed); + + ImagingDelete(imTransposed); + } + if (xradius == 0 && yradius == 0) { + ImagingCopy2(imOut, imIn); + } return imOut; }