diff --git a/imageio/imageio-jpeg-jai-interop/pom.xml b/imageio/imageio-jpeg-jai-interop/pom.xml
new file mode 100644
index 00000000..a87cc5f5
--- /dev/null
+++ b/imageio/imageio-jpeg-jai-interop/pom.xml
@@ -0,0 +1,40 @@
+
+
+ 4.0.0
+
+ com.twelvemonkeys.imageio
+ imageio
+ 3.7-SNAPSHOT
+
+ imageio-jpeg-jai-interop
+ TwelveMonkeys :: ImageIO :: JPEG/JAI TIFF Interop
+
+ Test JPEG plugin and JAI TIFF plugin interoperability
+
+
+
+
+ com.github.jai-imageio
+ jai-imageio-core
+ 1.3.0
+
+
+ com.twelvemonkeys.imageio
+ imageio-core
+
+
+ com.twelvemonkeys.imageio
+ imageio-core
+ test-jar
+ test
+
+
+ com.twelvemonkeys.imageio
+ imageio-metadata
+
+
+ com.twelvemonkeys.imageio
+ imageio-jpeg
+
+
+
diff --git a/imageio/imageio-jpeg-jai-interop/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/jaiinterop/JAITIFFImageReaderInteroperabilityTest.java b/imageio/imageio-jpeg-jai-interop/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/jaiinterop/JAITIFFImageReaderInteroperabilityTest.java
new file mode 100644
index 00000000..6401059a
--- /dev/null
+++ b/imageio/imageio-jpeg-jai-interop/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/jaiinterop/JAITIFFImageReaderInteroperabilityTest.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2021, 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 of the copyright holder 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 HOLDER 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.
+ */
+
+package com.twelvemonkeys.imageio.plugins.jpeg.jaiinterop;
+
+import com.twelvemonkeys.imageio.plugins.jpeg.JPEGImageReaderSpi;
+import com.twelvemonkeys.imageio.util.ImageReaderAbstractTest;
+
+import org.junit.Ignore;
+import org.junit.Test;
+
+import javax.imageio.ImageIO;
+import javax.imageio.ImageReader;
+import javax.imageio.spi.IIORegistry;
+import javax.imageio.spi.ImageReaderSpi;
+import javax.imageio.spi.ServiceRegistry;
+import java.awt.*;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import static org.junit.Assert.fail;
+
+/**
+ * Tests the JAI TIFFImageReader delegating to our JPEGImageReader.
+ *
+ * @author Harald Kuhr
+ * @author last modified by $Author: haraldk$
+ * @version $Id: JAITIFFImageReaderInteroperabilityTest.java,v 1.0 08.05.12 15:25 haraldk Exp$
+ */
+public class JAITIFFImageReaderInteroperabilityTest extends ImageReaderAbstractTest {
+ private static final String JAI_TIFF_PROVIDER_CLASS_NAME = "com.github.jaiimageio.impl.plugins.tiff.TIFFImageReaderSpi";
+
+ @Override
+ protected ImageReaderSpi createProvider() {
+ Iterator providers = IIORegistry.getDefaultInstance().getServiceProviders(ImageReaderSpi.class, new ServiceRegistry.Filter() {
+ @Override
+ public boolean filter(final Object provider) {
+ return JAI_TIFF_PROVIDER_CLASS_NAME.equals(provider.getClass().getName());
+ }
+ }, true);
+
+ if (providers.hasNext()) {
+ return providers.next();
+ }
+
+ return null;
+ }
+
+ @Override
+ protected List getTestData() {
+ return Arrays.asList(
+ new TestData(getClassLoaderResource("/tiff/foto_0001.tif"), new Dimension(1663, 2338)), // Little endian, Old JPEG
+ new TestData(getClassLoaderResource("/tiff/cmyk_jpeg.tif"), new Dimension(100, 100)), // CMYK, JPEG compressed, with ICC profile
+ new TestData(getClassLoaderResource("/tiff/jpeg-lossless-8bit-gray.tif"), new Dimension(512, 512)) // Lossless JPEG Gray, 8 bit/sample
+ );
+ }
+
+ @Override
+ protected List getFormatNames() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ protected List getSuffixes() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ protected List getMIMETypes() {
+ return Collections.emptyList();
+ }
+
+ @Ignore("Fails in TIFFImageReader")
+ @Override
+ public void testSetDestinationIllegal() {
+ }
+
+ @Test
+ public void testReallyUsingOurJPEGImageReader() {
+ Iterator readers = ImageIO.getImageReadersByFormatName("JPEG");
+
+ if (readers.hasNext()) {
+ ImageReader reader = readers.next();
+
+ if ((reader.getOriginatingProvider() instanceof JPEGImageReaderSpi)) {
+ return;
+ }
+ }
+
+ fail("Expected Spi not registered (dependency issue?): " + JPEGImageReaderSpi.class);
+ }
+}
diff --git a/imageio/imageio-jpeg-jai-interop/src/test/resources/tiff/cmyk_jpeg.tif b/imageio/imageio-jpeg-jai-interop/src/test/resources/tiff/cmyk_jpeg.tif
new file mode 100644
index 00000000..85d0bc92
Binary files /dev/null and b/imageio/imageio-jpeg-jai-interop/src/test/resources/tiff/cmyk_jpeg.tif differ
diff --git a/imageio/imageio-jpeg-jai-interop/src/test/resources/tiff/foto_0001.tif b/imageio/imageio-jpeg-jai-interop/src/test/resources/tiff/foto_0001.tif
new file mode 100644
index 00000000..a8f80d87
Binary files /dev/null and b/imageio/imageio-jpeg-jai-interop/src/test/resources/tiff/foto_0001.tif differ
diff --git a/imageio/imageio-jpeg-jai-interop/src/test/resources/tiff/jpeg-lossless-8bit-gray.tif b/imageio/imageio-jpeg-jai-interop/src/test/resources/tiff/jpeg-lossless-8bit-gray.tif
new file mode 100755
index 00000000..dfa11295
Binary files /dev/null and b/imageio/imageio-jpeg-jai-interop/src/test/resources/tiff/jpeg-lossless-8bit-gray.tif differ
diff --git a/imageio/imageio-jpeg-jep262-interop/pom.xml b/imageio/imageio-jpeg-jep262-interop/pom.xml
new file mode 100644
index 00000000..9f1d0f5b
--- /dev/null
+++ b/imageio/imageio-jpeg-jep262-interop/pom.xml
@@ -0,0 +1,35 @@
+
+
+ 4.0.0
+
+ com.twelvemonkeys.imageio
+ imageio
+ 3.7-SNAPSHOT
+
+ imageio-jpeg-jep262-interop
+ TwelveMonkeys :: ImageIO :: JPEG/JEP-262 Interop
+
+ Test JPEG plugin and JEP-262 (JDK TIFF plugin) interoperability
+
+
+
+
+ com.twelvemonkeys.imageio
+ imageio-core
+
+
+ com.twelvemonkeys.imageio
+ imageio-core
+ test-jar
+ test
+
+
+ com.twelvemonkeys.imageio
+ imageio-metadata
+
+
+ com.twelvemonkeys.imageio
+ imageio-jpeg
+
+
+
diff --git a/imageio/imageio-jpeg-jep262-interop/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/jep262interop/JEP262TIFFImageReaderInteroperabilityTest.java b/imageio/imageio-jpeg-jep262-interop/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/jep262interop/JEP262TIFFImageReaderInteroperabilityTest.java
new file mode 100644
index 00000000..5b197393
--- /dev/null
+++ b/imageio/imageio-jpeg-jep262-interop/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/jep262interop/JEP262TIFFImageReaderInteroperabilityTest.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 2021, 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 of the copyright holder 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 HOLDER 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.
+ */
+
+package com.twelvemonkeys.imageio.plugins.jpeg.jep262interop;
+
+import com.twelvemonkeys.imageio.plugins.jpeg.JPEGImageReaderSpi;
+import com.twelvemonkeys.imageio.util.ImageReaderAbstractTest;
+
+import org.junit.Ignore;
+import org.junit.Test;
+
+import javax.imageio.ImageIO;
+import javax.imageio.ImageReader;
+import javax.imageio.spi.IIORegistry;
+import javax.imageio.spi.ImageReaderSpi;
+import javax.imageio.spi.ServiceRegistry;
+import java.awt.*;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
+
+/**
+ * Tests the JEP 262 TIFFImageReader delegating to our JPEGImageReader.
+ *
+ * @author Harald Kuhr
+ * @author last modified by $Author: haraldk$
+ * @version $Id: TIFFImageReaderTest.java,v 1.0 08.05.12 15:25 haraldk Exp$
+ */
+public class JEP262TIFFImageReaderInteroperabilityTest extends ImageReaderAbstractTest {
+ private static final String JEP_262_PROVIDER_CLASS_NAME = "com.sun.imageio.plugins.tiff.TIFFImageReaderSpi";
+
+ @Override
+ protected ImageReaderSpi createProvider() {
+ Iterator providers = IIORegistry.getDefaultInstance().getServiceProviders(ImageReaderSpi.class, new ServiceRegistry.Filter() {
+ @Override
+ public boolean filter(final Object provider) {
+ return JEP_262_PROVIDER_CLASS_NAME.equals(provider.getClass().getName()) && ((ImageReaderSpi) provider).getVendorName().startsWith("Oracle");
+ }
+ }, true);
+
+ if (providers.hasNext()) {
+ return providers.next();
+ }
+
+ // Skip tests if we have no Spi (ie. pre JDK 9)
+ assumeTrue("Provider " + JEP_262_PROVIDER_CLASS_NAME + " not found", false);
+
+ return null;
+ }
+
+ @Override
+ protected List getTestData() {
+ return Arrays.asList(
+ new TestData(getClassLoaderResource("/tiff/foto_0001.tif"), new Dimension(1663, 2338)), // Little endian, Old JPEG
+ new TestData(getClassLoaderResource("/tiff/cmyk_jpeg.tif"), new Dimension(100, 100)), // CMYK, JPEG compressed, with ICC profile
+ new TestData(getClassLoaderResource("/tiff/jpeg-lossless-8bit-gray.tif"), new Dimension(512, 512)) // Lossless JPEG Gray, 8 bit/sample
+ );
+ }
+
+ @Override
+ protected List getFormatNames() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ protected List getSuffixes() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ protected List getMIMETypes() {
+ return Collections.emptyList();
+ }
+
+ @Ignore("Fails in TIFFImageReader")
+ @Override
+ public void testSetDestinationIllegal() {
+ }
+
+ @Test
+ public void testReallyUsingOurJPEGImageReader() {
+ Iterator readers = ImageIO.getImageReadersByFormatName("JPEG");
+
+ if (readers.hasNext()) {
+ ImageReader reader = readers.next();
+
+ if ((reader.getOriginatingProvider() instanceof JPEGImageReaderSpi)) {
+ return;
+ }
+ }
+
+ fail("Expected Spi not registered (dependency issue?): " + JPEGImageReaderSpi.class);
+ }
+}
diff --git a/imageio/imageio-jpeg-jep262-interop/src/test/resources/tiff/cmyk_jpeg.tif b/imageio/imageio-jpeg-jep262-interop/src/test/resources/tiff/cmyk_jpeg.tif
new file mode 100644
index 00000000..85d0bc92
Binary files /dev/null and b/imageio/imageio-jpeg-jep262-interop/src/test/resources/tiff/cmyk_jpeg.tif differ
diff --git a/imageio/imageio-jpeg-jep262-interop/src/test/resources/tiff/foto_0001.tif b/imageio/imageio-jpeg-jep262-interop/src/test/resources/tiff/foto_0001.tif
new file mode 100644
index 00000000..a8f80d87
Binary files /dev/null and b/imageio/imageio-jpeg-jep262-interop/src/test/resources/tiff/foto_0001.tif differ
diff --git a/imageio/imageio-jpeg-jep262-interop/src/test/resources/tiff/jpeg-lossless-8bit-gray.tif b/imageio/imageio-jpeg-jep262-interop/src/test/resources/tiff/jpeg-lossless-8bit-gray.tif
new file mode 100755
index 00000000..dfa11295
Binary files /dev/null and b/imageio/imageio-jpeg-jep262-interop/src/test/resources/tiff/jpeg-lossless-8bit-gray.tif differ
diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReader.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReader.java
index 2a152f92..5cc68b09 100644
--- a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReader.java
+++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReader.java
@@ -636,6 +636,12 @@ public final class JPEGImageReader extends ImageReaderBase {
try {
if (imageInput != null) {
+ // Need to wrap stream to avoid messing with the byte order of the underlying stream
+ // in the case we are operating as a delegate for ie. TIFFImageReader.
+ if (!(imageInput instanceof SubImageInputStream)) {
+ imageInput = new SubImageInputStream(imageInput, Long.MAX_VALUE);
+ }
+
streamOffsets.add(imageInput.getStreamPosition());
}
@@ -650,7 +656,7 @@ public final class JPEGImageReader extends ImageReaderBase {
private void initDelegate(boolean seekForwardOnly, boolean ignoreMetadata) throws IOException {
// JPEGSegmentImageInputStream that filters out/skips bad/unnecessary segments
delegate.setInput(imageInput != null
- ? new JPEGSegmentImageInputStream(new SubImageInputStream(imageInput, Long.MAX_VALUE), new JPEGSegmentWarningDelegate())
+ ? new JPEGSegmentImageInputStream(imageInput, new JPEGSegmentWarningDelegate())
: null, seekForwardOnly, ignoreMetadata);
}
@@ -705,7 +711,6 @@ public final class JPEGImageReader extends ImageReaderBase {
thumbnails = null;
initDelegate(seekForwardOnly, ignoreMetadata);
-
initHeader();
}
diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGSegmentImageInputStream.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGSegmentImageInputStream.java
index f32f4d56..028071d7 100644
--- a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGSegmentImageInputStream.java
+++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGSegmentImageInputStream.java
@@ -67,7 +67,6 @@ final class JPEGSegmentImageInputStream extends ImageInputStreamImpl {
private int currentSegment = -1;
private Segment segment;
-
JPEGSegmentImageInputStream(final ImageInputStream stream, final JPEGSegmentWarningListener warningListener) {
this.stream = notNull(stream, "stream");
this.warningListener = notNull(warningListener, "warningListener");
@@ -333,7 +332,7 @@ final class JPEGSegmentImageInputStream extends ImageInputStreamImpl {
}
private void streamInit() throws IOException {
- stream.seek(0);
+ long position = stream.getStreamPosition();
try {
int soi = stream.readUnsignedShort();
@@ -342,7 +341,7 @@ final class JPEGSegmentImageInputStream extends ImageInputStreamImpl {
throw new IIOException(String.format("Not a JPEG stream (starts with: 0x%04x, expected SOI: 0x%04x)", soi, JPEG.SOI));
}
- segment = new Segment(soi, 0, 0, 2);
+ segment = new Segment(soi, position, 0, 2);
segments.add(segment);
currentSegment = segments.size() - 1; // 0
diff --git a/imageio/imageio-tiff-jdk-interop/pom.xml b/imageio/imageio-tiff-jdk-interop/pom.xml
new file mode 100644
index 00000000..6eb42888
--- /dev/null
+++ b/imageio/imageio-tiff-jdk-interop/pom.xml
@@ -0,0 +1,35 @@
+
+
+ 4.0.0
+
+ com.twelvemonkeys.imageio
+ imageio
+ 3.7-SNAPSHOT
+
+ imageio-tiff-jdk-interop
+ TwelveMonkeys :: ImageIO :: TIFF/JDK JPEG Interop
+
+ Test TIFF plugin and JDK JPEG plugin interoperability
+
+
+
+
+ com.twelvemonkeys.imageio
+ imageio-core
+
+
+ com.twelvemonkeys.imageio
+ imageio-core
+ test-jar
+ test
+
+
+ com.twelvemonkeys.imageio
+ imageio-metadata
+
+
+ com.twelvemonkeys.imageio
+ imageio-tiff
+
+
+
diff --git a/imageio/imageio-tiff-jdk-interop/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/jdkinterop/TIFFImageReaderJDKJPEGInteroperabilityTest.java b/imageio/imageio-tiff-jdk-interop/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/jdkinterop/TIFFImageReaderJDKJPEGInteroperabilityTest.java
new file mode 100644
index 00000000..cce05aa5
--- /dev/null
+++ b/imageio/imageio-tiff-jdk-interop/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/jdkinterop/TIFFImageReaderJDKJPEGInteroperabilityTest.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (c) 2021, 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 of the copyright holder 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 HOLDER 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.
+ */
+
+package com.twelvemonkeys.imageio.plugins.jpeg.jdkinterop;
+
+import com.twelvemonkeys.imageio.plugins.tiff.TIFFImageReader;
+import com.twelvemonkeys.imageio.plugins.tiff.TIFFImageReaderSpi;
+import com.twelvemonkeys.imageio.util.ImageReaderAbstractTest;
+
+import org.junit.Ignore;
+import org.junit.Test;
+
+import javax.imageio.ImageIO;
+import javax.imageio.ImageReader;
+import javax.imageio.spi.ImageReaderSpi;
+import java.awt.*;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import static org.junit.Assert.fail;
+
+/**
+ * Tests our TIFFImageReader delegating to the JDK JPEGImageReader.
+ *
+ * @author Harald Kuhr
+ * @author last modified by $Author: haraldk$
+ * @version $Id: TIFFImageReaderJDKJPEGInteroperabilityTest.java,v 1.0 08.05.12 15:25 haraldk Exp$
+ */
+public class TIFFImageReaderJDKJPEGInteroperabilityTest extends ImageReaderAbstractTest {
+ private static final String JDK_JPEG_PROVIDER_CLASS_NAME = "com.sun.imageio.plugins.jpeg.JPEGImageReaderSpi";
+
+ @Override
+ protected ImageReaderSpi createProvider() {
+ return new TIFFImageReaderSpi();
+ }
+
+ @Override
+ protected List getTestData() {
+ return Arrays.asList(
+ new TestData(getClassLoaderResource("/tiff/foto_0001.tif"), new Dimension(1663, 2338)), // Little endian, Old JPEG
+ new TestData(getClassLoaderResource("/tiff/quad-jpeg.tif"), new Dimension(512, 384)), // YCbCr, JPEG compressed, striped
+ new TestData(getClassLoaderResource("/tiff/cmyk_jpeg.tif"), new Dimension(100, 100)) // CMYK, JPEG compressed, with ICC profile
+ );
+ }
+
+ @Override
+ protected List getFormatNames() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ protected List getSuffixes() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ protected List getMIMETypes() {
+ return Collections.emptyList();
+ }
+
+ @Ignore("Fails in TIFFImageReader")
+ @Override
+ public void testSetDestinationIllegal() {
+ }
+
+ @Test
+ public void testReallyUsingJDKJPEGImageReader() {
+ Iterator readers = ImageIO.getImageReadersByFormatName("JPEG");
+
+ if (readers.hasNext()) {
+ ImageReader reader = readers.next();
+
+ if (JDK_JPEG_PROVIDER_CLASS_NAME.equals(reader.getOriginatingProvider().getClass().getName())) {
+ return;
+ }
+ }
+
+ fail("Expected Spi not in use (dependency issue?): " + JDK_JPEG_PROVIDER_CLASS_NAME);
+ }
+}
diff --git a/imageio/imageio-tiff-jdk-interop/src/test/resources/tiff/cmyk_jpeg.tif b/imageio/imageio-tiff-jdk-interop/src/test/resources/tiff/cmyk_jpeg.tif
new file mode 100644
index 00000000..85d0bc92
Binary files /dev/null and b/imageio/imageio-tiff-jdk-interop/src/test/resources/tiff/cmyk_jpeg.tif differ
diff --git a/imageio/imageio-tiff-jdk-interop/src/test/resources/tiff/foto_0001.tif b/imageio/imageio-tiff-jdk-interop/src/test/resources/tiff/foto_0001.tif
new file mode 100644
index 00000000..a8f80d87
Binary files /dev/null and b/imageio/imageio-tiff-jdk-interop/src/test/resources/tiff/foto_0001.tif differ
diff --git a/imageio/imageio-tiff-jdk-interop/src/test/resources/tiff/quad-jpeg.tif b/imageio/imageio-tiff-jdk-interop/src/test/resources/tiff/quad-jpeg.tif
new file mode 100755
index 00000000..e14f4c22
Binary files /dev/null and b/imageio/imageio-tiff-jdk-interop/src/test/resources/tiff/quad-jpeg.tif differ
diff --git a/imageio/pom.xml b/imageio/pom.xml
index 08c6de08..709e8c9e 100644
--- a/imageio/pom.xml
+++ b/imageio/pom.xml
@@ -52,6 +52,9 @@
imageio-reference
+ imageio-jpeg-jep262-interop
+ imageio-jpeg-jai-interop
+ imageio-tiff-jdk-interop
@@ -143,6 +146,12 @@
${project.version}
+
+ ${project.groupId}
+ imageio-tiff
+ ${project.version}
+
+
${project.groupId}
imageio-core