blob: dda78335d65d366f476aa72c8f7c48997198c31c [file] [log] [blame]
/*
* Copyright (c) 2007, 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 6549882
* @summary Test verifies that PNG image reader creates buffered image
* of standart type for 8 bpp images with color type RGB or RGBAlpha
*
* @run main PngOutputTypeTest
*/
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.Iterator;
import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.stream.ImageInputStream;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
public class PngOutputTypeTest {
public static void main(String[] args) throws IOException {
new PngOutputTypeTest(BufferedImage.TYPE_INT_RGB).doTest();
new PngOutputTypeTest(BufferedImage.TYPE_INT_ARGB).doTest();
}
ImageInputStream iis;
ImageReader reader;
public PngOutputTypeTest(int type) throws IOException {
this(createTestImage(type));
}
public PngOutputTypeTest(File f) throws IOException {
this(ImageIO.createImageInputStream(f));
}
public PngOutputTypeTest(ImageInputStream iis) throws IOException {
this.iis = iis;
reader = ImageIO.getImageReaders(iis).next();
reader.setInput(iis);
}
BufferedImage def;
BufferedImage raw;
ImageTypeSpecifier raw_type;
public void doTest() throws IOException {
/*
* This test verifies that png images with color type RGB or RGBA
* are decoded as buffered image of some standard type.
*
* So we need to be sure that image provided by
* user has required color type - RGB or RGBA
*/
if (!checkImageType()) {
System.out.println("Test IGNORED!");
return;
}
def = reader.read(0);
System.out.println("Default image type: " + def.getType());
if (def == null || def.getType() == BufferedImage.TYPE_CUSTOM) {
throw new RuntimeException("Test FAILED!");
}
raw_type = reader.getRawImageType(0);
ImageReadParam param = reader.getDefaultReadParam();
param.setDestinationType(raw_type);
System.out.println("Reading with raw image type...");
raw = reader.read(0, param);
System.out.println("Type of raw image is " + raw.getType());
compare(def, raw);
Iterator<ImageTypeSpecifier> types = reader.getImageTypes(0);
while (types.hasNext()) {
ImageTypeSpecifier t = types.next();
System.out.println("Test type: " + t);
param.setDestinationType(t);
BufferedImage img = reader.read(0, param);
System.out.println("Result type: " + img.getType());
compare(def, img);
System.out.println("Done.\n");
}
System.out.println("Test PASSED.");
}
private boolean checkImageType() throws IOException {
IIOMetadata md = null;
try {
md = reader.getImageMetadata(0);
} catch (IOException e) {
return false;
}
String format = md.getNativeMetadataFormatName();
Node root = md.getAsTree(format);
Node ihdr = getNode(root, "IHDR");
if (ihdr == null) {
throw new RuntimeException("No ihdr node: invalid png image!");
}
String colorType = getAttributeValue(ihdr, "colorType");
System.out.println("ColorType: " + colorType);
if ("RGB".equals(colorType) || "RGBAlpha".equals(colorType)) {
// we shuld chek bitDepth
System.out.println("Good color type!");
String bitDepthStr = getAttributeValue(ihdr, "bitDepth");
System.out.println("bitDepth: " + bitDepthStr);
int bitDepth = -1;
try {
bitDepth = Integer.parseInt(bitDepthStr);
} catch (NumberFormatException e) {
throw new RuntimeException("Invalid bitDepth!");
}
if (bitDepth == 8) {
/*
* This image is RGB or RGBA color type and
* 8 bit tepth. so it can be used for test
*/
return true;
}
}
return false;
}
private String getAttributeValue(Node n, String attrname) {
NamedNodeMap attrs = n.getAttributes();
if (attrs == null) {
return null;
} else {
Node a = attrs.getNamedItem(attrname);
if (a == null) {
return null;
} else {
return a.getNodeValue();
}
}
}
private Node getNode(Node root, String name) {
Node n = root;
return lookupNode(n, name);
}
private Node lookupNode(Node n, String name) {
if (n == null) {
return null;
}
if (name.equals(n.getNodeName())) {
return n;
} else {
// may be next on this level?
Node res = lookupNode(n.getNextSibling(), name);
if (res != null) {
return res;
} else {
/// try children then
return lookupNode(n.getFirstChild(), name);
}
}
}
private static void compare(BufferedImage a, BufferedImage b) {
int w = a.getWidth();
int h = a.getHeight();
if (w != b.getWidth() || h != b.getHeight()) {
throw new RuntimeException("Test FAILED!");
}
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++) {
if (a.getRGB(x, y) != b.getRGB(x, y)) {
throw new RuntimeException("Test FAILED!");
}
}
}
}
static Color[] colors = new Color[] { Color.red, Color.green, Color.blue };
private static ImageInputStream createTestImage(int type) throws IOException {
int w = 100;
int h = 100;
BufferedImage img = new BufferedImage(w, h, type);
int dx = w / colors.length;
for (int i = 0; i < colors.length; i++) {
for (int x = i *dx; (x < (i + 1) * dx) && (x < w) ; x++) {
for (int y = 0; y < h; y++) {
img.setRGB(x, y, colors[i].getRGB());
}
}
}
File pwd = new File(".");
File out = File.createTempFile("rgba_", ".png", pwd);
System.out.println("Create file: " + out.getAbsolutePath());
ImageIO.write(img, "PNG", out);
return ImageIO.createImageInputStream(out);
}
}