| /* |
| * Copyright (c) 2003, 2017, 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 4924507 |
| * @summary Test that listeners of bmp reader receive correct events in case of |
| * BI_JPEG and BI_PNG compression types |
| */ |
| |
| import java.awt.Color; |
| import java.awt.Graphics2D; |
| import java.awt.image.BufferedImage; |
| import java.io.ByteArrayInputStream; |
| import java.io.ByteArrayOutputStream; |
| import java.io.IOException; |
| import java.util.ArrayList; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import javax.imageio.IIOImage; |
| import javax.imageio.ImageIO; |
| import javax.imageio.ImageReader; |
| import javax.imageio.ImageWriteParam; |
| import javax.imageio.ImageWriter; |
| import javax.imageio.event.IIOReadProgressListener; |
| import javax.imageio.event.IIOReadUpdateListener; |
| |
| public class ReaderListenersTest { |
| public static final String[] compTypes = { "BI_JPEG", "BI_PNG" }; |
| |
| public static void main(String[] args) { |
| for (int i=0; i< compTypes.length; i++) { |
| doTest(compTypes[i]); |
| } |
| } |
| |
| private static void doTest(String compression) { |
| try { |
| BufferedImage img = createTestImage(); |
| |
| ImageWriter iw = (ImageWriter) |
| ImageIO.getImageWritersByFormatName("bmp").next(); |
| if (iw == null) { |
| throw new RuntimeException("No writers for bmp format." |
| + " Test failed."); |
| } |
| |
| |
| ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
| iw.setOutput(ImageIO.createImageOutputStream(baos)); |
| ImageWriteParam param = iw.getDefaultWriteParam(); |
| param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); |
| param.setCompressionType(compression); |
| |
| iw.write(null, new IIOImage(img, null, null), param); |
| baos.close(); |
| |
| ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); |
| |
| ImageReader ir = (ImageReader) |
| ImageIO.getImageReadersByFormatName("bmp").next(); |
| if (ir == null) { |
| throw new RuntimeException("No readers for bmp format." |
| + " Test failed."); |
| } |
| |
| IIOReadUpdateAdapter updateAdapter = new IIOReadUpdateAdapter(); |
| IIOReadProgressAdapter progressAdapter = new IIOReadProgressAdapter(); |
| ir.addIIOReadProgressListener(progressAdapter); |
| ir.addIIOReadUpdateListener(updateAdapter); |
| ir.setInput(ImageIO.createImageInputStream(bais)); |
| BufferedImage dst = ir.read(0); |
| |
| progressAdapter.checkResults(); |
| |
| if (!updateAdapter.isImageUpdateUsed) { |
| throw new RuntimeException("imageUpdate was not used." |
| + " Test failed."); |
| } |
| } catch(IOException e) { |
| e.printStackTrace(); |
| throw new RuntimeException("Test failed"); |
| } |
| } |
| |
| protected static BufferedImage createTestImage() { |
| BufferedImage res = new BufferedImage(100, 100, |
| BufferedImage.TYPE_INT_RGB); |
| Graphics2D g = res.createGraphics(); |
| g.setColor(Color.red); |
| g.fillRect(0,0, 100,100); |
| return res; |
| } |
| |
| static class IIOReadProgressAdapter implements IIOReadProgressListener { |
| List progress = new ArrayList(); |
| public boolean isTestPassed = false; |
| private boolean isImageStarted = false; |
| private boolean isImageComplete = false; |
| private boolean isSequenceComplete = false; |
| private boolean isSequenceStarted = false; |
| |
| public void imageComplete(ImageReader source) { |
| System.out.println("Image completed"); |
| if (!isImageComplete) { |
| isImageComplete = true; |
| } else { |
| throw new RuntimeException("The imageComplete() is called twice." |
| + " Test failed."); |
| } |
| checkProgress(); |
| } |
| |
| public void imageProgress(ImageReader source, float percentageDone) { |
| System.out.println("Image Progress "+percentageDone); |
| progress.add(new Float(percentageDone)); |
| } |
| |
| public void imageStarted(ImageReader source, int imageIndex) { |
| System.out.println("Image Started "+imageIndex); |
| if (!isImageStarted) { |
| isImageStarted = true; |
| } else { |
| throw new RuntimeException("The imageStarted() was called twice. " |
| + " Test failed."); |
| } |
| progress.clear(); |
| } |
| |
| public void thumbnailComplete(ImageReader source) { |
| System.out.println("Thubnail completed"); |
| } |
| |
| public void thumbnailProgress(ImageReader source, |
| float percentageDone) |
| { |
| System.out.println("Thubnail Progress " + percentageDone); |
| } |
| |
| public void thumbnailStarted(ImageReader source, |
| int imageIndex, int thumbnailIndex) |
| { |
| System.out.println("Thubnail started " + imageIndex); |
| } |
| |
| public void sequenceComplete(ImageReader source) { |
| if (!isSequenceComplete) { |
| isSequenceComplete = true; |
| } else { |
| throw new RuntimeException("The imageComplete() is called twice." |
| + " Test failed."); |
| } |
| } |
| |
| public void sequenceStarted(ImageReader source, int minIndex) { |
| if (!isSequenceStarted) { |
| isSequenceStarted = true; |
| } else { |
| throw new RuntimeException("The imageComplete() is called twice." |
| + " Test failed."); |
| } |
| } |
| |
| public void readAborted(ImageReader source) { |
| System.out.println("read Aborted"); |
| checkProgress(); |
| } |
| |
| private void checkProgress() { |
| Iterator i = progress.iterator(); |
| if (!i.hasNext()) { |
| throw new RuntimeException("progress values list is empty!"); |
| } |
| float val = ((Float)i.next()).floatValue(); |
| while(i.hasNext()) { |
| float next = ((Float)i.next()).floatValue(); |
| if (val >= next) { |
| throw new RuntimeException("progress values do not increase!"); |
| } |
| val = next; |
| } |
| isTestPassed = true; |
| System.out.println("Test passed."); |
| } |
| |
| public void checkResults() { |
| if (isImageStarted && !isImageComplete) { |
| throw new RuntimeException("The imageCompleted was not called." |
| + " Test failed."); |
| } |
| } |
| } |
| |
| static class IIOReadUpdateAdapter implements IIOReadUpdateListener { |
| boolean isImageUpdateUsed = false; |
| public void imageUpdate(ImageReader source, BufferedImage theImage, |
| int minX, int minY, int width, int height, |
| int periodX, int periodY, int[] bands) |
| { |
| System.out.println("imageUpdate"); |
| isImageUpdateUsed = true; |
| } |
| public void passComplete(ImageReader source, BufferedImage theImage) { |
| System.out.println("passComplete"); |
| } |
| public void passStarted(ImageReader source, BufferedImage theImage, |
| int pass, int minPass, int maxPass, |
| int minX, int minY, int periodX, int periodY, |
| int[] bands) |
| { |
| System.out.println("passStarted"); |
| } |
| public void thumbnailPassComplete(ImageReader source, |
| BufferedImage theThumbnail) |
| { |
| System.out.println("thumbnailPassComplete"); |
| } |
| public void thumbnailPassStarted(ImageReader source, |
| BufferedImage theThumbnail, |
| int pass, int minPass, int maxPass, |
| int minX, int minY, |
| int periodX, int periodY, |
| int[] bands) |
| { |
| System.out.println("thumbnailPassStarted"); |
| } |
| public void thumbnailUpdate(ImageReader source, |
| BufferedImage theThumbnail, |
| int minX, int minY, |
| int width, int height, |
| int periodX, int periodY, int[] bands) |
| { |
| System.out.println("thumbnailUpdate"); |
| } |
| } |
| } |