/* * $Id$ * * Copyright (c) 2010 by Joel Uckelman * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License (LGPL) as published by the Free Software Foundation. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, copies are available * at http://www.opensource.org. */ package VASSAL.tools.image; import java.awt.Dimension; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import javax.imageio.ImageIO; import VASSAL.tools.io.IOUtils; import org.apache.commons.lang.SystemUtils; import org.junit.Assume; import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.*; import static VASSAL.tools.image.AssertImage.*; public class ImageIOImageLoaderTest { protected static final String jpg = "test/VASSAL/tools/image/rainbow.jpg"; protected static BufferedImage src; @BeforeClass public static void setup() throws IOException { src = ImageIO.read(new File(jpg)); } protected BufferedImage read(ImageLoader loader, String file) throws IOException { FileInputStream in = null; try { in = new FileInputStream(file); final BufferedImage img = loader.load( file, in, BufferedImage.TYPE_INT_RGB, BufferedImage.TYPE_INT_ARGB, false ); in.close(); return img; } finally { IOUtils.closeQuietly(in); } } @Test public void testLoadOk() throws IOException { final ImageTypeConverter mconv = new MemoryImageTypeConverter(); final ImageIOImageLoader loader = new ImageIOImageLoader(mconv); final BufferedImage actual = read(loader, jpg); assertEquals(BufferedImage.TYPE_INT_RGB, actual.getType()); assertImageContentEquals(src, actual); } @Test public void testLoadType2tRNSBug() throws IOException { final String efile = "test/VASSAL/tools/image/non-type2-tRNS.png"; final String afile = "test/VASSAL/tools/image/type2-tRNS.png"; final ImageTypeConverter mconv = new MemoryImageTypeConverter(); final ImageIOImageLoader loader = new ImageIOImageLoader(mconv); final BufferedImage expected = ImageIO.read(new File(efile)); final BufferedImage actual = read(loader, afile); assertEquals(BufferedImage.TYPE_INT_ARGB, actual.getType()); // We check that: // (1) the images have the same fully-transparent pixels, and // (2) all other pixels are identical final int w = expected.getWidth(); final int h = expected.getHeight(); for (int x = 0; x < w; ++x) { for (int y = 0; y < h; ++y) { final int ep = expected.getRGB(x, y); final int ap = actual.getRGB(x, y); if ((ep & 0xff000000) == 0 && (ap & 0xff000000) == 0) { // color components of fully-transparent pixels don't matter continue; } assertEquals(ep, ap); } } } @Test public void testLoad_iTXTBug() throws IOException { final String efile = "test/VASSAL/tools/image/no-iTXt.png"; final String afile = "test/VASSAL/tools/image/iTXt.png"; final ImageTypeConverter mconv = new MemoryImageTypeConverter(); final ImageIOImageLoader loader = new ImageIOImageLoader(mconv); final BufferedImage expected = read(loader, efile); final BufferedImage actual = read(loader, afile); assertEquals(BufferedImage.TYPE_INT_ARGB, actual.getType()); assertImageContentEquals(expected, actual); } @Test(expected=BrokenImageException.class) public void testLoadRGB_JPEG_NonRGB_Color_Profile() throws IOException { final String afile = "test/VASSAL/tools/image/WatervilleDuelpark.jpg"; final ImageTypeConverter mconv = new MemoryImageTypeConverter(); final ImageIOImageLoader loader = new ImageIOImageLoader(mconv); final BufferedImage actual = read(loader, afile); } @Test(expected=BrokenImageException.class) public void testLoadLCMS_Error() throws IOException { // this appears to be fixed in Java >= 1.7 if (SystemUtils.isJavaVersionAtLeast(1.7f)) { throw new BrokenImageException("bogus"); } final String afile = "test/VASSAL/tools/image/09.jpg"; final ImageTypeConverter mconv = new MemoryImageTypeConverter(); final ImageIOImageLoader loader = new ImageIOImageLoader(mconv); final BufferedImage actual = read(loader, afile); } protected Dimension size(ImageLoader loader, String file) throws IOException { FileInputStream in = null; try { in = new FileInputStream(file); final Dimension d = loader.size(file, in); in.close(); return d; } finally { IOUtils.closeQuietly(in); } } @Test public void testSizeOk() throws IOException { final ImageTypeConverter mconv = new MemoryImageTypeConverter(); final ImageIOImageLoader loader = new ImageIOImageLoader(mconv); final Dimension ed = new Dimension(src.getWidth(), src.getHeight()); final Dimension ad = size(loader, jpg); assertEquals(ed, ad); } @Test(expected=UnrecognizedImageTypeException.class) public void testSizeUnrecognized() throws IOException { final String junk = "test/VASSAL/tools/image/ImageIOImageLoaderTest.java"; final ImageTypeConverter mconv = new MemoryImageTypeConverter(); final ImageIOImageLoader loader = new ImageIOImageLoader(mconv); final Dimension ad = size(loader, junk); } @Test(expected=BrokenImageException.class) public void testSizeLCMS_Error() throws IOException { // this appears to be fixed in Java >= 1.7 if (SystemUtils.isJavaVersionAtLeast(1.7f)) { throw new BrokenImageException("bogus"); } final String afile = "test/VASSAL/tools/image/09.jpg"; final ImageTypeConverter mconv = new MemoryImageTypeConverter(); final ImageIOImageLoader loader = new ImageIOImageLoader(mconv); final Dimension ad = size(loader, afile); } }