From 6ce58dd68236879a834ee4b08db6404777cf1bda Mon Sep 17 00:00:00 2001 From: Harald Kuhr Date: Fri, 27 Nov 2015 13:20:44 +0100 Subject: [PATCH] #195 ArrayIndexOutOfBoundsException for ResampleOp in certain cases --- .../java/com/twelvemonkeys/image/ResampleOp.java | 4 ++-- .../twelvemonkeys/image/ResampleOpTestCase.java | 14 +++++++++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/common/common-image/src/main/java/com/twelvemonkeys/image/ResampleOp.java b/common/common-image/src/main/java/com/twelvemonkeys/image/ResampleOp.java index 2f598cb0..1929a77b 100644 --- a/common/common-image/src/main/java/com/twelvemonkeys/image/ResampleOp.java +++ b/common/common-image/src/main/java/com/twelvemonkeys/image/ResampleOp.java @@ -1465,7 +1465,7 @@ public class ResampleOp implements BufferedImageOp/* TODO: RasterOp */ { for (int i = 0; i < dstHeight; i++) { //contribY[i].n = 0; - contribY[i].p = new Contributor[(int) (width * 2.0 + 1)]; + contribY[i].p = new Contributor[(int) (width * 2.0 + 1 + 0.5)]; double center = (double) i / yscale; int left = (int) Math.ceil(center - width); @@ -1516,7 +1516,7 @@ public class ResampleOp implements BufferedImageOp/* TODO: RasterOp */ { else { for (int i = 0; i < dstHeight; ++i) { //contribY[i].n = 0; - contribY[i].p = new Contributor[(int) (fwidth * 2 + 1)]; + contribY[i].p = new Contributor[(int) (fwidth * 2 + 1 + 0.5)]; double center = (double) i / yscale; double left = Math.ceil(center - fwidth); diff --git a/common/common-image/src/test/java/com/twelvemonkeys/image/ResampleOpTestCase.java b/common/common-image/src/test/java/com/twelvemonkeys/image/ResampleOpTestCase.java index b7d1d036..d57ac006 100644 --- a/common/common-image/src/test/java/com/twelvemonkeys/image/ResampleOpTestCase.java +++ b/common/common-image/src/test/java/com/twelvemonkeys/image/ResampleOpTestCase.java @@ -69,7 +69,7 @@ public class ResampleOpTestCase { } private void assertResampleBufferedImageTypes(final int pFilterType) { - List exceptions = new ArrayList(); + List exceptions = new ArrayList<>(); // Test all image types in BufferedImage for (int type = BufferedImage.TYPE_INT_ARGB; type <= BufferedImage.TYPE_BYTE_INDEXED; type++) { @@ -304,6 +304,18 @@ public class ResampleOpTestCase { assertResampleBufferedImageTypes(ResampleOp.FILTER_LANCZOS); } + // https://github.com/haraldk/TwelveMonkeys/issues/195 + @Test + public void testAIOOBE() { + BufferedImage myImage = new BufferedImage(100, 354, BufferedImage.TYPE_INT_ARGB); + + for (int i = 19; i > 0; i--) { + ResampleOp resampler = new ResampleOp(100, i, ResampleOp.FILTER_LANCZOS); + BufferedImage resizedImage = resampler.filter(myImage, null); + assertNotNull(resizedImage); + } + } + @Ignore("Not for general unit testing") @Test public void testTime() {