From a9834530de05e719453ed66d260a6d8e838ef2f4 Mon Sep 17 00:00:00 2001 From: Ajit Ghaisas Date: Thu, 2 Jun 2016 15:16:07 +0530 Subject: [PATCH] 8139192: Custom ImageFilters return blank images in Java 8(.45) while working in 7 Reviewed-by: flar, prr --- .../sun/awt/image/OffScreenImageSource.java | 17 ++- .../OffScreenImageSource/ImageFilterTest.java | 136 ++++++++++++++++++ 2 files changed, 151 insertions(+), 2 deletions(-) create mode 100644 jdk/test/sun/awt/image/OffScreenImageSource/ImageFilterTest.java diff --git a/jdk/src/java.desktop/share/classes/sun/awt/image/OffScreenImageSource.java b/jdk/src/java.desktop/share/classes/sun/awt/image/OffScreenImageSource.java index 3dcdde01574..12fe4f61394 100644 --- a/jdk/src/java.desktop/share/classes/sun/awt/image/OffScreenImageSource.java +++ b/jdk/src/java.desktop/share/classes/sun/awt/image/OffScreenImageSource.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -186,8 +186,21 @@ public class OffScreenImageSource implements ImageProducer { theConsumer.setProperties(properties); sendPixels(); theConsumer.imageComplete(ImageConsumer.SINGLEFRAMEDONE); - theConsumer.imageComplete(ImageConsumer.STATICIMAGEDONE); + + try { + theConsumer.imageComplete(ImageConsumer.STATICIMAGEDONE); + } catch (RuntimeException e) { + // We did not previously call this method here and + // some image consumer filters were not prepared for it to be + // called at this time. We allow them to have runtime issues + // for this one call only without triggering the IMAGEERROR + // condition below. + e.printStackTrace(); + } + } catch (NullPointerException e) { + e.printStackTrace(); + if (theConsumer != null) { theConsumer.imageComplete(ImageConsumer.IMAGEERROR); } diff --git a/jdk/test/sun/awt/image/OffScreenImageSource/ImageFilterTest.java b/jdk/test/sun/awt/image/OffScreenImageSource/ImageFilterTest.java new file mode 100644 index 00000000000..7e74186bdac --- /dev/null +++ b/jdk/test/sun/awt/image/OffScreenImageSource/ImageFilterTest.java @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* @test + * @bug 8139192 + * @summary Test to check OffScreenImageSource handles + * ImageFilter.imageComplete() behaviors + * @run main ImageFilterTest + */ + +import java.awt.Image; +import java.awt.Toolkit; +import java.awt.image.BufferedImage; +import java.awt.image.FilteredImageSource; +import java.awt.image.ImageFilter; + + +public class ImageFilterTest { + + public static void main(String[] args) { + String[] scenarios = { + "SUCCESS", + "SINGLEFRAMEDONE exception", + "STATICIMAGEDONE exception" + }; + + for (String str : scenarios) { + MyImageFilter testFilter = new MyImageFilter(str); + test(testFilter); + } + } + + public static void test(MyImageFilter testFilter) { + Image image = new BufferedImage(10, 10, BufferedImage.TYPE_INT_ARGB); + FilteredImageSource filtered = + new FilteredImageSource(image.getSource(), testFilter); + + Image img = Toolkit.getDefaultToolkit().createImage(filtered); + + BufferedImage buffImage = new BufferedImage(img.getWidth(null), + img.getHeight(null), BufferedImage.TYPE_INT_ARGB); + } +} + +class MyImageFilter extends ImageFilter { + + private String testScenario; + private boolean intermediateStatus; + + public MyImageFilter(String scenario) { + super(); + + testScenario = scenario; + intermediateStatus = false; + } + + @Override + public void imageComplete(int status) { + switch (testScenario) { + case "SUCCESS": + if (status == SINGLEFRAMEDONE) { + intermediateStatus = true; + } + + if (status == STATICIMAGEDONE) { + if (!intermediateStatus) { + throw new RuntimeException("STATICIMAGEDONE is not expected"); + } + } + + if (status == IMAGEERROR) { + throw new RuntimeException("IMAGEERROR is not expected"); + } + break; + + case "SINGLEFRAMEDONE exception": + if (status == SINGLEFRAMEDONE) { + intermediateStatus = true; + + throw new NullPointerException("NullPointerException for testing purpose"); + } + + if (status == IMAGEERROR) { + if (!intermediateStatus) { + throw new RuntimeException("IMAGEERROR is not expected"); + } + } + + if (status == STATICIMAGEDONE) { + throw new RuntimeException("STATICIMAGEDONE is not expected"); + } + break; + + case "STATICIMAGEDONE exception": + if (status == SINGLEFRAMEDONE) { + intermediateStatus = true; + } + + if (status == STATICIMAGEDONE) { + if (intermediateStatus) { + throw new RuntimeException("RuntimeException for testing purpose"); + } + } + + if (status == IMAGEERROR) { + throw new RuntimeException("IMAGEERROR is not expected"); + } + break; + + default: + throw new RuntimeException("Invalid Test Scenario"); + } + } +} + +