blob: cfa621e818adf271887ccaae9c1f8d5b7117648b [file] [log] [blame]
/*
* 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");
}
}
}