diff --git a/twelvemonkeys-imageio/core/src/test/java/com/twelvemonkeys/imageio/util/ImageReaderAbstractTestCase.java b/twelvemonkeys-imageio/core/src/test/java/com/twelvemonkeys/imageio/util/ImageReaderAbstractTestCase.java index fd6dd848..bbfe5387 100644 --- a/twelvemonkeys-imageio/core/src/test/java/com/twelvemonkeys/imageio/util/ImageReaderAbstractTestCase.java +++ b/twelvemonkeys-imageio/core/src/test/java/com/twelvemonkeys/imageio/util/ImageReaderAbstractTestCase.java @@ -1206,12 +1206,18 @@ public abstract class ImageReaderAbstractTestCase extends catch (IIOException expected) { // TODO: This is thrown by ImageReader.getDestination. But are we happy with that? // The problem is that the checkReadParamBandSettings throws IllegalArgumentException, which seems more appropriate... - String message = expected.getMessage(); - assertTrue("Wrong message: " + message, message.toLowerCase().contains("destination")); + String message = expected.getMessage().toLowerCase(); + assertTrue( + "Wrong message: " + message + " for type " + destination.getType(), + message.contains("destination") || + ((destination.getType() == BufferedImage.TYPE_BYTE_BINARY || + destination.getType() == BufferedImage.TYPE_BYTE_INDEXED) + && message.contains("indexcolormodel")) + ); } catch (IllegalArgumentException expected) { - String message = expected.getMessage(); - assertTrue("Wrong message: " + message, message.toLowerCase().contains("dest")); + String message = expected.getMessage().toLowerCase(); + assertTrue("Wrong message: " + message, message.contains("dest")); } } } @@ -1233,14 +1239,14 @@ public abstract class ImageReaderAbstractTestCase extends } catch (IIOException expected) { // TODO: This is thrown by ImageReader.getDestination. But are we happy with that? - String message = expected.getMessage(); - assertTrue(message.toLowerCase().contains("destination")); - assertTrue(message.toLowerCase().contains("type")); + String message = expected.getMessage().toLowerCase(); + assertTrue(message.contains("destination")); + assertTrue(message.contains("type")); } catch (IllegalArgumentException expected) { - String message = expected.getMessage(); - assertTrue(message.toLowerCase().contains("destination")); - assertTrue(message.toLowerCase().contains("type")); + String message = expected.getMessage().toLowerCase(); + assertTrue(message.contains("destination")); + assertTrue(message.contains("type")); } } } @@ -1272,13 +1278,14 @@ public abstract class ImageReaderAbstractTestCase extends } // TODO: Test dest offset + destination set? + // TODO: Test that destination offset is used for image data, not just image dimensions... public void testSetDestinationOffset() throws IOException { final ImageReader reader = createReader(); TestData data = getTestData().get(0); reader.setInput(data.getInputStream()); ImageReadParam param = reader.getDefaultReadParam(); - Point point = new Point(10, 10); + Point point = new Point(37, 42); param.setDestinationOffset(point); BufferedImage image = reader.read(0, param); diff --git a/twelvemonkeys-imageio/ico/src/main/java/com/twelvemonkeys/imageio/plugins/ico/ICOImageReader.java b/twelvemonkeys-imageio/ico/src/main/java/com/twelvemonkeys/imageio/plugins/ico/ICOImageReader.java index 7be3ab71..4510ab71 100644 --- a/twelvemonkeys-imageio/ico/src/main/java/com/twelvemonkeys/imageio/plugins/ico/ICOImageReader.java +++ b/twelvemonkeys-imageio/ico/src/main/java/com/twelvemonkeys/imageio/plugins/ico/ICOImageReader.java @@ -292,6 +292,7 @@ public class ICOImageReader extends ImageReaderBase { } private BufferedImage readBitmap(final DirectoryEntry pEntry) throws IOException { + // TODO: Get rid of the caching, as the images are mutable BitmapDescriptor descriptor = mDescriptors.get(pEntry); if (descriptor == null || !mDescriptors.containsKey(pEntry)) { diff --git a/twelvemonkeys-imageio/pom.xml b/twelvemonkeys-imageio/pom.xml index d03f5ef7..f5a557ef 100644 --- a/twelvemonkeys-imageio/pom.xml +++ b/twelvemonkeys-imageio/pom.xml @@ -41,6 +41,8 @@ batik jmagick + + reference diff --git a/twelvemonkeys-imageio/reference/license.txt b/twelvemonkeys-imageio/reference/license.txt new file mode 100644 index 00000000..2d8ee79c --- /dev/null +++ b/twelvemonkeys-imageio/reference/license.txt @@ -0,0 +1,25 @@ +Copyright (c) 2009, Harald Kuhr +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name "TwelveMonkeys" nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/twelvemonkeys-imageio/reference/pom.xml b/twelvemonkeys-imageio/reference/pom.xml new file mode 100644 index 00000000..12ddce93 --- /dev/null +++ b/twelvemonkeys-imageio/reference/pom.xml @@ -0,0 +1,31 @@ + + + 4.0.0 + com.twelvemonkeys.imageio + twelvemonkeys-imageio-reference + 2.2-SNAPSHOT + TwelveMonkeys ImageIO reference test cases + + Test cases for the JDK provided ImageReader implementations for reference. + + + + twelvemonkeys-imageio + com.twelvemonkeys + 2.2-SNAPSHOT + + + + + com.twelvemonkeys.imageio + twelvemonkeys-imageio-core + + + com.twelvemonkeys.imageio + twelvemonkeys-imageio-core + tests + + + \ No newline at end of file diff --git a/twelvemonkeys-imageio/reference/src/test/java/com/twelvemonkeys/imageio/reference/JPEGImageReaderTestCase.java b/twelvemonkeys-imageio/reference/src/test/java/com/twelvemonkeys/imageio/reference/JPEGImageReaderTestCase.java new file mode 100644 index 00000000..f8bb1f02 --- /dev/null +++ b/twelvemonkeys-imageio/reference/src/test/java/com/twelvemonkeys/imageio/reference/JPEGImageReaderTestCase.java @@ -0,0 +1,91 @@ +package com.twelvemonkeys.imageio.reference; + +import com.sun.imageio.plugins.jpeg.JPEGImageReader; +import com.sun.imageio.plugins.jpeg.JPEGImageReaderSpi; +import com.twelvemonkeys.imageio.util.ImageReaderAbstractTestCase; +import com.twelvemonkeys.lang.SystemUtil; + +import javax.imageio.spi.ImageReaderSpi; +import java.util.Arrays; +import java.util.List; +import java.awt.*; +import java.io.IOException; + +/** + * JPEGImageReaderTestCase + * + * @author Harald Kuhr + * @author last modified by $Author: haraldk$ + * @version $Id: JPEGImageReaderTestCase.java,v 1.0 Oct 9, 2009 3:37:25 PM haraldk Exp$ + */ +public class JPEGImageReaderTestCase extends ImageReaderAbstractTestCase { + private static final boolean IS_JAVA_6 = SystemUtil.isClassAvailable("java.util.Deque"); + + protected JPEGImageReaderSpi mProvider = new JPEGImageReaderSpi(); + + @Override + protected List getTestData() { + return Arrays.asList( + new TestData(getClassLoaderResource("/jpeg/R-7439-1151526181.jpeg"), new Dimension(386, 396)) + ); + } + + @Override + protected ImageReaderSpi createProvider() { + return mProvider; + } + + @Override + protected Class getReaderClass() { + return JPEGImageReader.class; + } + + @Override + protected JPEGImageReader createReader() { + try { + return (JPEGImageReader) mProvider.createReaderInstance(); + } + catch (IOException e) { + throw new RuntimeException(e); + } + } + + // These are NOT correct implementations, but I don't really care here + @Override + protected List getFormatNames() { + return Arrays.asList(mProvider.getFormatNames()); + } + + @Override + protected List getSuffixes() { + return Arrays.asList(mProvider.getFileSuffixes()); + } + + @Override + protected List getMIMETypes() { + return Arrays.asList(mProvider.getMIMETypes()); + } + + @Override + public void testSetDestination() throws IOException { + // Known bug in Sun JPEGImageReader before Java 6 + if (IS_JAVA_6) { + super.testSetDestination(); + } + else { + System.err.println("WARNING: Test skipped due to known bug in Java 1.5, please test again with Java 6 or later"); + } + } + + @Override + public void testSetDestinationType() throws IOException { + // Known bug in Sun JPEGImageReader before Java 6 + if (IS_JAVA_6) { + super.testSetDestinationType(); + } + else { + System.err.println("WARNING: Test skipped due to known bug in Java 1.5, please test again with Java 6 or later"); + } + } + +} diff --git a/twelvemonkeys-imageio/reference/src/test/java/com/twelvemonkeys/imageio/reference/PNGImageReaderTestCase.java b/twelvemonkeys-imageio/reference/src/test/java/com/twelvemonkeys/imageio/reference/PNGImageReaderTestCase.java new file mode 100644 index 00000000..591d8b28 --- /dev/null +++ b/twelvemonkeys-imageio/reference/src/test/java/com/twelvemonkeys/imageio/reference/PNGImageReaderTestCase.java @@ -0,0 +1,65 @@ +package com.twelvemonkeys.imageio.reference; + +import com.sun.imageio.plugins.png.PNGImageReader; +import com.sun.imageio.plugins.png.PNGImageReaderSpi; +import com.twelvemonkeys.imageio.util.ImageReaderAbstractTestCase; + +import javax.imageio.spi.ImageReaderSpi; +import java.awt.*; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +/** + * PNGImageReaderTestCase + * + * @author Harald Kuhr + * @author last modified by $Author: haraldk$ + * @version $Id: PNGImageReaderTestCase.java,v 1.0 Oct 9, 2009 3:37:25 PM haraldk Exp$ + */ +public class PNGImageReaderTestCase extends ImageReaderAbstractTestCase { + protected PNGImageReaderSpi mProvider = new PNGImageReaderSpi(); + + @Override + protected List getTestData() { + return Arrays.asList( + new TestData(getClassLoaderResource("/png/12monkeys-splash.png"), new Dimension(300, 410)) + ); + } + + @Override + protected ImageReaderSpi createProvider() { + return mProvider; + } + + @Override + protected Class getReaderClass() { + return PNGImageReader.class; + } + + @Override + protected PNGImageReader createReader() { + try { + return (PNGImageReader) mProvider.createReaderInstance(); + } + catch (IOException e) { + throw new RuntimeException(e); + } + } + + // These are NOT correct implementations, but I don't really care here + @Override + protected List getFormatNames() { + return Arrays.asList(mProvider.getFormatNames()); + } + + @Override + protected List getSuffixes() { + return Arrays.asList(mProvider.getFileSuffixes()); + } + + @Override + protected List getMIMETypes() { + return Arrays.asList(mProvider.getMIMETypes()); + } +} \ No newline at end of file diff --git a/twelvemonkeys-imageio/reference/src/test/resources/jpeg/R-7439-1151526181.jpeg b/twelvemonkeys-imageio/reference/src/test/resources/jpeg/R-7439-1151526181.jpeg new file mode 100644 index 00000000..a20a5899 Binary files /dev/null and b/twelvemonkeys-imageio/reference/src/test/resources/jpeg/R-7439-1151526181.jpeg differ diff --git a/twelvemonkeys-imageio/reference/src/test/resources/png/12monkeys-splash.png b/twelvemonkeys-imageio/reference/src/test/resources/png/12monkeys-splash.png new file mode 100755 index 00000000..7ec39a00 Binary files /dev/null and b/twelvemonkeys-imageio/reference/src/test/resources/png/12monkeys-splash.png differ diff --git a/twelvemonkeys-imageio/thumbsdb/src/main/java/com/twelvemonkeys/imageio/plugins/thumbsdb/ThumbsDBImageReader.java b/twelvemonkeys-imageio/thumbsdb/src/main/java/com/twelvemonkeys/imageio/plugins/thumbsdb/ThumbsDBImageReader.java old mode 100755 new mode 100644 index 33929f50..56b80623 --- a/twelvemonkeys-imageio/thumbsdb/src/main/java/com/twelvemonkeys/imageio/plugins/thumbsdb/ThumbsDBImageReader.java +++ b/twelvemonkeys-imageio/thumbsdb/src/main/java/com/twelvemonkeys/imageio/plugins/thumbsdb/ThumbsDBImageReader.java @@ -80,6 +80,7 @@ public class ThumbsDBImageReader extends ImageReaderBase { protected ThumbsDBImageReader(final ThumbsDBImageReaderSpi pProvider) { super(pProvider); mReader = createJPEGReader(pProvider); + initReaderListeners(); } protected void resetMembers() { @@ -128,11 +129,11 @@ public class ThumbsDBImageReader extends ImageReaderBase { * @throws java.io.IOException if an error occurs during reading */ @Override - public BufferedImage read(int pIndex, ImageReadParam pParam) throws IOException { + public BufferedImage read(final int pIndex, final ImageReadParam pParam) throws IOException { init(); checkBounds(pIndex); - // Quick lookup + // Quick look-up BufferedImage image = null; if (pIndex < mThumbnails.length) { image = mThumbnails[pIndex]; @@ -145,7 +146,9 @@ public class ThumbsDBImageReader extends ImageReaderBase { image = mReader.read(0, pParam); mReader.reset(); - mThumbnails[pIndex] = image; + if (pParam == null) { + mThumbnails[pIndex] = image; // TODO: Caching is not kosher, as images are mutable!! + } } else { // Keep progress listeners happy @@ -154,6 +157,23 @@ public class ThumbsDBImageReader extends ImageReaderBase { processImageComplete(); } + // Fake destination support + if (pParam != null && (pParam.getDestination() != null && pParam.getDestination() != image || + pParam.getDestinationType() != null && pParam.getDestinationType().getBufferedImageType() != image.getType())) { + BufferedImage destination = getDestination(pParam, getImageTypes(pIndex), getWidth(pIndex), getHeight(pIndex)); + + Graphics2D g = destination.createGraphics(); + try { + g.setComposite(AlphaComposite.Src); + g.drawImage(image, 0, 0, null); + } + finally { + g.dispose(); + } + + image = destination; + } + return image; } @@ -195,7 +215,7 @@ public class ThumbsDBImageReader extends ImageReaderBase { } private void init(final int pIndex) throws IOException { - if (mCurrentImage == -1 || pIndex != mCurrentImage) { + if (mCurrentImage == -1 || pIndex != mCurrentImage || mReader.getInput() == null) { init(); checkBounds(pIndex); mCurrentImage = pIndex; @@ -212,39 +232,32 @@ public class ThumbsDBImageReader extends ImageReaderBase { ImageInputStream input = new MemoryCacheImageInputStream(entry.getInputStream()); input.skipBytes(THUMBNAIL_OFFSET); mReader.setInput(input); - initReaderListeners(); } private void initReaderListeners() { - if (progressListeners != null) { - mReader.addIIOReadProgressListener(new ProgressListenerBase() { - @Override - public void imageComplete(ImageReader pSource) { - processImageComplete(); - } + mReader.addIIOReadProgressListener(new ProgressListenerBase() { + @Override + public void imageComplete(ImageReader pSource) { + processImageComplete(); + } - @Override - public void imageStarted(ImageReader pSource, int pImageIndex) { - processImageStarted(mCurrentImage); - } + @Override + public void imageStarted(ImageReader pSource, int pImageIndex) { + processImageStarted(mCurrentImage); + } - @Override - public void imageProgress(ImageReader pSource, float pPercentageDone) { - processImageProgress(pPercentageDone); - } + @Override + public void imageProgress(ImageReader pSource, float pPercentageDone) { + processImageProgress(pPercentageDone); + } - @Override - public void readAborted(ImageReader pSource) { - processReadAborted(); - } - }); - } - if (updateListeners != null) { - // TODO: Update listeners - } - if (warningListeners != null) { - // TODO: Warning listeners - } + @Override + public void readAborted(ImageReader pSource) { + processReadAborted(); + } + }); + // TODO: Update listeners + // TODO: Warning listeners } private void init() throws IOException { @@ -307,6 +320,7 @@ public class ThumbsDBImageReader extends ImageReaderBase { public Iterator getImageTypes(int pIndex) throws IOException { init(pIndex); + initReader(pIndex); return mReader.getImageTypes(0); } diff --git a/twelvemonkeys-imageio/thumbsdb/src/test/java/com/twelvemonkeys/imageio/plugins/thumbsdb/ThumbsDBImageReaderTestCase.java b/twelvemonkeys-imageio/thumbsdb/src/test/java/com/twelvemonkeys/imageio/plugins/thumbsdb/ThumbsDBImageReaderTestCase.java old mode 100755 new mode 100644 index 63aacaf2..868658cc --- a/twelvemonkeys-imageio/thumbsdb/src/test/java/com/twelvemonkeys/imageio/plugins/thumbsdb/ThumbsDBImageReaderTestCase.java +++ b/twelvemonkeys-imageio/thumbsdb/src/test/java/com/twelvemonkeys/imageio/plugins/thumbsdb/ThumbsDBImageReaderTestCase.java @@ -32,6 +32,7 @@ import com.twelvemonkeys.imageio.stream.BufferedImageInputStream; import com.twelvemonkeys.imageio.util.ImageReaderAbstractTestCase; import com.twelvemonkeys.io.ole2.CompoundDocument; import com.twelvemonkeys.io.ole2.Entry; +import com.twelvemonkeys.lang.SystemUtil; import javax.imageio.spi.ImageReaderSpi; import javax.imageio.stream.ImageInputStream; @@ -50,6 +51,8 @@ import java.util.List; * @version $Id: ICOImageReaderTestCase.java,v 1.0 Apr 1, 2008 10:39:17 PM haraldk Exp$ */ public class ThumbsDBImageReaderTestCase extends ImageReaderAbstractTestCase { + private static final boolean IS_JAVA_6 = SystemUtil.isClassAvailable("java.util.Deque"); + private ThumbsDBImageReaderSpi mProvider = new ThumbsDBImageReaderSpi(); protected List getTestData() { @@ -111,4 +114,26 @@ public class ThumbsDBImageReaderTestCase extends ImageReaderAbstractTestCase