diff --git a/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/util/ImageReaderAbstractTest.java b/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/util/ImageReaderAbstractTest.java index 80dca1aa..ea4b6ec2 100644 --- a/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/util/ImageReaderAbstractTest.java +++ b/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/util/ImageReaderAbstractTest.java @@ -122,12 +122,16 @@ public abstract class ImageReaderAbstractTest { boolean found = false; while (pReaders.hasNext()) { ImageReader reader = pReaders.next(); - if (reader.getClass() == pReaderClass) { + if (reader.getClass() == pReaderClass && isOurProvider(reader.getOriginatingProvider())) { found = true; } } - assertTrue(String.format("%s not installed for %s", pReaderClass.getSimpleName(), pFormat), found); + assertTrue(String.format("%s not provided by %s for '%s'", pReaderClass.getSimpleName(), provider.getClass().getSimpleName(), pFormat), found); + } + + private boolean isOurProvider(final ImageReaderSpi spi) { + return provider.getClass().isInstance(spi); } @Test diff --git a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/HeaderWriter.java b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/HeaderWriter.java index 6df9a386..1b80a598 100755 --- a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/HeaderWriter.java +++ b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/HeaderWriter.java @@ -30,6 +30,8 @@ package com.twelvemonkeys.imageio.plugins.pnm; +import com.twelvemonkeys.imageio.ImageWriterBase; + import org.w3c.dom.NodeList; import javax.imageio.IIOImage; @@ -40,27 +42,30 @@ import javax.imageio.spi.ImageWriterSpi; import javax.imageio.stream.ImageOutputStream; import java.awt.image.DataBuffer; import java.io.IOException; -import java.nio.charset.Charset; import java.util.Locale; +import static java.nio.charset.StandardCharsets.UTF_8; + abstract class HeaderWriter { - protected static final Charset UTF8 = Charset.forName("UTF8"); protected final ImageOutputStream imageOutput; protected HeaderWriter(final ImageOutputStream imageOutput) { this.imageOutput = imageOutput; } - public static void write(final IIOImage image, final ImageWriterSpi provider, final ImageOutputStream imageOutput) throws IOException { - // TODO: This is somewhat sketchy... - if (provider.getFormatNames()[0].equals("pam")) { - new PAMHeaderWriter(imageOutput).writeHeader(image, provider); + public static void write(final IIOImage image, final ImageWriterBase writer, final ImageOutputStream imageOutput) throws IOException { + createHeaderWriter(writer.getFormatName(), imageOutput).writeHeader(image, writer.getOriginatingProvider()); + } + + private static HeaderWriter createHeaderWriter(final String formatName, final ImageOutputStream imageOutput) { + if (formatName.equals("pam")) { + return new PAMHeaderWriter(imageOutput); } - else if (provider.getFormatNames()[0].equals("pnm")) { - new PNMHeaderWriter(imageOutput).writeHeader(image, provider); + else if (formatName.equals("pnm")) { + return new PNMHeaderWriter(imageOutput); } else { - throw new AssertionError("Unsupported provider: " + provider); + throw new AssertionError("Unsupported format: " + formatName); } } @@ -101,7 +106,7 @@ abstract class HeaderWriter { protected final void writeComments(final IIOMetadata metadata, final ImageWriterSpi provider) throws IOException { // TODO: Only write creator if not already present - imageOutput.write(String.format("# CREATOR: %s %s\n", provider.getVendorName(), provider.getDescription(Locale.getDefault())).getBytes(UTF8)); + imageOutput.write(String.format("# CREATOR: %s %s\n", provider.getVendorName(), provider.getDescription(Locale.getDefault())).getBytes(UTF_8)); // Comments from metadata if (metadata != null && metadata.isStandardMetadataFormatSupported()) { @@ -111,7 +116,7 @@ abstract class HeaderWriter { for (int i = 0; i < textEntries.getLength(); i++) { // TODO: Write on the format "# KEYWORD: value" (if keyword != comment)? IIOMetadataNode textEntry = (IIOMetadataNode) textEntries.item(i); - imageOutput.write(String.format("# %s", textEntry.getAttribute("value")).getBytes(UTF8)); + imageOutput.write(String.format("# %s", textEntry.getAttribute("value")).getBytes(UTF_8)); } } } diff --git a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PAMHeaderParser.java b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PAMHeaderParser.java index e5e3b365..5337cf2b 100755 --- a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PAMHeaderParser.java +++ b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PAMHeaderParser.java @@ -66,7 +66,7 @@ final class PAMHeaderParser extends HeaderParser { int depth = -1; int maxVal = -1; TupleType tupleType = null; - List comments = new ArrayList(); + List comments = new ArrayList<>(); String line; while ((line = input.readLine()) != null && !line.startsWith(ENDHDR)) { diff --git a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PAMHeaderWriter.java b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PAMHeaderWriter.java index c2c6fece..6e2fcc0b 100755 --- a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PAMHeaderWriter.java +++ b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PAMHeaderWriter.java @@ -35,6 +35,8 @@ import javax.imageio.spi.ImageWriterSpi; import javax.imageio.stream.ImageOutputStream; import java.io.IOException; +import static java.nio.charset.StandardCharsets.UTF_8; + final class PAMHeaderWriter extends HeaderWriter { public PAMHeaderWriter(final ImageOutputStream imageOutput) { super(imageOutput); @@ -48,14 +50,14 @@ final class PAMHeaderWriter extends HeaderWriter { // Comments writeComments(image.getMetadata(), provider); // Write width/height and number of channels - imageOutput.write(String.format("WIDTH %s\nHEIGHT %s\n", getWidth(image), getHeight(image)).getBytes(UTF8)); - imageOutput.write(String.format("DEPTH %s\n", getNumBands(image)).getBytes(UTF8)); + imageOutput.write(String.format("WIDTH %s\nHEIGHT %s\n", getWidth(image), getHeight(image)).getBytes(UTF_8)); + imageOutput.write(String.format("DEPTH %s\n", getNumBands(image)).getBytes(UTF_8)); // TODO: maxSample (8 or16 bit) - imageOutput.write(String.format("MAXVAL %s\n", getMaxVal(image)).getBytes(UTF8)); + imageOutput.write(String.format("MAXVAL %s\n", getMaxVal(image)).getBytes(UTF_8)); // TODO: Determine tuple type based on input color model and image data TupleType tupleType = getNumBands(image) > 3 ? TupleType.RGB_ALPHA : TupleType.RGB; - imageOutput.write(String.format("TUPLTYPE %s\nENDHDR\n", tupleType).getBytes(UTF8)); + imageOutput.write(String.format("TUPLTYPE %s\nENDHDR\n", tupleType).getBytes(UTF_8)); } } diff --git a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PAMImageReaderSpi.java b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PAMImageReaderSpi.java new file mode 100755 index 00000000..6cd149e6 --- /dev/null +++ b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PAMImageReaderSpi.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2020, 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.pnm; + +import com.twelvemonkeys.imageio.spi.ImageReaderSpiBase; + +import javax.imageio.ImageReader; +import javax.imageio.stream.ImageInputStream; +import java.io.IOException; +import java.util.Locale; + +public final class PAMImageReaderSpi extends ImageReaderSpiBase { + + /** + * Creates a {@code PAMImageReaderSpi}. + */ + public PAMImageReaderSpi() { + super(new PAMProviderInfo()); + } + + @Override + public boolean canDecodeInput(final Object source) throws IOException { + if (!(source instanceof ImageInputStream)) { + return false; + } + + ImageInputStream stream = (ImageInputStream) source; + stream.mark(); + + try { + return stream.readShort() == PNM.PAM && stream.readInt() != PNM.XV_THUMBNAIL_MAGIC; + } + finally { + stream.reset(); + } + } + + @Override + public ImageReader createReaderInstance(final Object extension) { + return new PNMImageReader(this); + } + + @Override + public String getDescription(final Locale locale) { + return "NetPBM Portable Arbitrary Map (PAM) image reader"; + } +} diff --git a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PAMImageWriterSpi.java b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PAMImageWriterSpi.java index c20d4918..e0342b0f 100755 --- a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PAMImageWriterSpi.java +++ b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PAMImageWriterSpi.java @@ -30,39 +30,19 @@ package com.twelvemonkeys.imageio.plugins.pnm; -import com.twelvemonkeys.imageio.spi.ProviderInfo; +import com.twelvemonkeys.imageio.spi.ImageWriterSpiBase; import javax.imageio.ImageTypeSpecifier; import javax.imageio.ImageWriter; -import javax.imageio.spi.ImageWriterSpi; -import javax.imageio.stream.ImageOutputStream; import java.util.Locale; -public final class PAMImageWriterSpi extends ImageWriterSpi { +public final class PAMImageWriterSpi extends ImageWriterSpiBase { /** * Creates a {@code PAMImageWriterSpi}. */ public PAMImageWriterSpi() { - this(new PNMProviderInfo()); - } - - private PAMImageWriterSpi(final ProviderInfo pProviderInfo) { - super( - pProviderInfo.getVendorName(), - pProviderInfo.getVersion(), - new String[] {"pam", "PAM"}, - new String[] {"pam"}, - new String[] { - // No official IANA record exists, these are conventional - "image/x-portable-arbitrarymap" // PAM - }, - "com.twelvemonkeys.imageio.plugins.pnm.PNMImageWriter", - new Class[] {ImageOutputStream.class}, - new String[] {"com.twelvemonkeys.imageio.plugins.pnm.PNMImageReaderSpi"}, - true, null, null, null, null, - true, null, null, null, null - ); + super(new PAMProviderInfo()); } public boolean canEncodeImage(final ImageTypeSpecifier pType) { diff --git a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PAMProviderInfo.java b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PAMProviderInfo.java new file mode 100644 index 00000000..acaf3553 --- /dev/null +++ b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PAMProviderInfo.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2020, 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.pnm; + +import com.twelvemonkeys.imageio.spi.ReaderWriterProviderInfo; + +/** + * PAMProviderInfo. + * + * @author Harald Kuhr + * @author last modified by $Author: harald.kuhr$ + * @version $Id: PAMProviderInfo.java,v 1.0 20/03/15 harald.kuhr Exp$ + */ +class PAMProviderInfo extends ReaderWriterProviderInfo { + public PAMProviderInfo() { + super(PAMProviderInfo.class, + new String[] { + "pam", + "PAM" + }, + new String[] {"pam"}, + new String[] { + // No official IANA record exists, these are conventional + "image/x-portable-arbitrarymap" + }, + "com.twelvemonkeys.imageio.plugins.pnm.PNMImageReader", + new String[] { + "com.twelvemonkeys.imageio.plugins.pnm.PAMImageReaderSpi", + "com.twelvemonkeys.imageio.plugins.pnm.PNMImageReaderSpi" + }, + "com.twelvemonkeys.imageio.plugins.pnm.PNMImageWriter", + new String[] { + "com.twelvemonkeys.imageio.plugins.pnm.PAMImageWriterSpi", + "com.twelvemonkeys.imageio.plugins.pnm.PNMImageWriterSpi" + }, + true, // supports standard stream metadata + null, null, // native stream format name and class + null, null, // extra stream formats + true, // supports standard image metadata + null, null, + null, null // extra image metadata formats + ); + } +} diff --git a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PFMHeaderParser.java b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PFMHeaderParser.java index 3b071c80..c145f90a 100755 --- a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PFMHeaderParser.java +++ b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PFMHeaderParser.java @@ -71,7 +71,7 @@ final class PFMHeaderParser extends HeaderParser { int height = 0; float maxSample = tupleType == TupleType.BLACKANDWHITE_WHITE_IS_ZERO ? 1 : 0; // PBM has no maxSample line - List comments = new ArrayList(); + List comments = new ArrayList<>(); while (width == 0 || height == 0 || maxSample == 0) { String line = input.readLine(); diff --git a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMHeader.java b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMHeader.java index 62629d27..2b3e35bb 100755 --- a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMHeader.java +++ b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMHeader.java @@ -60,7 +60,7 @@ final class PNMHeader { this.maxSample = isTrue(tupleType.isValidMaxSample(maxSample), maxSample, "maxSample out of range: %d"); this.maxSampleFloat = this.maxSample; - this.comments = Collections.unmodifiableList(new ArrayList(comments)); + this.comments = Collections.unmodifiableList(new ArrayList<>(comments)); byteOrder = ByteOrder.BIG_ENDIAN; } @@ -76,7 +76,7 @@ final class PNMHeader { this.maxSampleFloat = maxSample; this.byteOrder = byteOrder; - this.comments = Collections.unmodifiableList(new ArrayList(comments)); + this.comments = Collections.unmodifiableList(new ArrayList<>(comments)); } private boolean isValidFileType(final short fileType) { diff --git a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMHeaderParser.java b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMHeaderParser.java index bdec6952..d27e7c95 100755 --- a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMHeaderParser.java +++ b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMHeaderParser.java @@ -68,7 +68,7 @@ final class PNMHeaderParser extends HeaderParser { int height = 0; int maxSample = tupleType == TupleType.BLACKANDWHITE_WHITE_IS_ZERO ? 1 : 0; // PBM has no maxSample line - List comments = new ArrayList(); + List comments = new ArrayList<>(); while (width == 0 || height == 0 || maxSample == 0) { String line = input.readLine(); diff --git a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMHeaderWriter.java b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMHeaderWriter.java index db0e69d7..3b1a60b8 100755 --- a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMHeaderWriter.java +++ b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMHeaderWriter.java @@ -35,6 +35,8 @@ import javax.imageio.spi.ImageWriterSpi; import javax.imageio.stream.ImageOutputStream; import java.io.IOException; +import static java.nio.charset.StandardCharsets.UTF_8; + final class PNMHeaderWriter extends HeaderWriter { public PNMHeaderWriter(final ImageOutputStream imageOutput) { super(imageOutput); @@ -52,11 +54,11 @@ final class PNMHeaderWriter extends HeaderWriter { writeComments(image.getMetadata(), provider); // Dimensions (width/height) - imageOutput.write(String.format("%s %s\n", getWidth(image), getHeight(image)).getBytes(HeaderWriter.UTF8)); + imageOutput.write(String.format("%s %s\n", getWidth(image), getHeight(image)).getBytes(UTF_8)); // MaxSample if (type != PNM.PBM) { - imageOutput.write(String.format("%s\n", getMaxVal(image)).getBytes(HeaderWriter.UTF8)); + imageOutput.write(String.format("%s\n", getMaxVal(image)).getBytes(UTF_8)); } } } diff --git a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMImageReader.java b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMImageReader.java index fac4a7c6..f878ac1c 100755 --- a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMImageReader.java +++ b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMImageReader.java @@ -170,7 +170,7 @@ public final class PNMImageReader extends ImageReaderBase { public Iterator getImageTypes(final int imageIndex) throws IOException { ImageTypeSpecifier rawType = getRawImageType(imageIndex); - List specifiers = new ArrayList(); + List specifiers = new ArrayList<>(); switch (header.getTupleType()) { case RGB: diff --git a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMImageReaderSpi.java b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMImageReaderSpi.java index 287f78e6..62863329 100755 --- a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMImageReaderSpi.java +++ b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMImageReaderSpi.java @@ -30,51 +30,20 @@ package com.twelvemonkeys.imageio.plugins.pnm; -import com.twelvemonkeys.imageio.spi.ProviderInfo; +import com.twelvemonkeys.imageio.spi.ImageReaderSpiBase; import javax.imageio.ImageReader; -import javax.imageio.spi.ImageReaderSpi; import javax.imageio.stream.ImageInputStream; import java.io.IOException; import java.util.Locale; -public final class PNMImageReaderSpi extends ImageReaderSpi { +public final class PNMImageReaderSpi extends ImageReaderSpiBase { /** * Creates a {@code PNMImageReaderSpi}. */ public PNMImageReaderSpi() { - this(new PNMProviderInfo()); - } - - private PNMImageReaderSpi(final ProviderInfo providerInfo) { - super( - providerInfo.getVendorName(), - providerInfo.getVersion(), - new String[] { - "pnm", "pbm", "pgm", "ppm", "pam", "pfm", - "PNM", "PBM", "PGM", "PPM", "PAM", "PFM" - }, - new String[] {"pbm", "pgm", "ppm", "pam", "pfm"}, - new String[] { - // No official IANA record exists, these are conventional - "image/x-portable-pixmap", - "image/x-portable-anymap", - "image/x-portable-arbitrarymap" // PAM - }, - "com.twelvemonkeys.imageio.plugins.pnm.PNMImageReader", - new Class[] {ImageInputStream.class}, - new String[] { - "com.twelvemonkeys.imageio.plugins.pnm.PNMImageWriterSpi", - "com.twelvemonkeys.imageio.plugins.pnm.PAMImageWriterSpi" - }, - true, // supports standard stream metadata - null, null, // native stream format name and class - null, null, // extra stream formats - true, // supports standard image metadata - null, null, - null, null // extra image metadata formats - ); + super(new PNMProviderInfo()); } @Override @@ -100,8 +69,6 @@ public final class PNMImageReaderSpi extends ImageReaderSpi { case PNM.PFM_GRAY: case PNM.PFM_RGB: return true; - case PNM.PAM: - return stream.readInt() != PNM.XV_THUMBNAIL_MAGIC; default: return false; } @@ -112,12 +79,12 @@ public final class PNMImageReaderSpi extends ImageReaderSpi { } @Override - public ImageReader createReaderInstance(final Object extension) throws IOException { + public ImageReader createReaderInstance(final Object extension) { return new PNMImageReader(this); } @Override public String getDescription(final Locale locale) { - return "NetPBM Portable Any Map (PNM and PAM) image reader"; + return "NetPBM Portable Any Map (PNM) image reader"; } } diff --git a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMImageWriter.java b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMImageWriter.java index 37ac662b..a5388e35 100755 --- a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMImageWriter.java +++ b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMImageWriter.java @@ -69,7 +69,7 @@ public final class PNMImageWriter extends ImageWriterBase { // TODO: Issue warning if streamMetadata is non-null? // TODO: Issue warning if IIOImage contains thumbnails or other data we can't store? - HeaderWriter.write(image, getOriginatingProvider(), imageOutput); + HeaderWriter.write(image, this, imageOutput); // TODO: Sub region // TODO: Subsampling diff --git a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMImageWriterSpi.java b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMImageWriterSpi.java index f91e5c68..315644d2 100755 --- a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMImageWriterSpi.java +++ b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMImageWriterSpi.java @@ -30,15 +30,13 @@ package com.twelvemonkeys.imageio.plugins.pnm; -import com.twelvemonkeys.imageio.spi.ProviderInfo; +import com.twelvemonkeys.imageio.spi.ImageWriterSpiBase; import javax.imageio.ImageTypeSpecifier; import javax.imageio.ImageWriter; -import javax.imageio.spi.ImageWriterSpi; -import javax.imageio.stream.ImageOutputStream; import java.util.Locale; -public final class PNMImageWriterSpi extends ImageWriterSpi { +public final class PNMImageWriterSpi extends ImageWriterSpiBase { // TODO: Consider one Spi for each sub-format, as it makes no sense for the writer to write PPM if client code requested PBM or PGM format. // ...Then again, what if user asks for PNM? :-P @@ -47,29 +45,7 @@ public final class PNMImageWriterSpi extends ImageWriterSpi { * Creates a {@code PNMImageWriterSpi}. */ public PNMImageWriterSpi() { - this(new PNMProviderInfo()); - } - - private PNMImageWriterSpi(final ProviderInfo pProviderInfo) { - super( - pProviderInfo.getVendorName(), - pProviderInfo.getVersion(), - new String[] { - "pnm", "pbm", "pgm", "ppm", - "PNM", "PBM", "PGM", "PPM" - }, - new String[] {"pbm", "pgm", "ppm"}, - new String[] { - // No official IANA record exists, these are conventional - "image/x-portable-pixmap", - "image/x-portable-anymap" - }, - "com.twelvemonkeys.imageio.plugins.pnm.PNMImageWriter", - new Class[] {ImageOutputStream.class}, - new String[] {"com.twelvemonkeys.imageio.plugins.pnm.PNMImageReaderSpi"}, - true, null, null, null, null, - true, null, null, null, null - ); + super(new PNMProviderInfo()); } public boolean canEncodeImage(final ImageTypeSpecifier pType) { diff --git a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMProviderInfo.java b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMProviderInfo.java index 3f496378..a41d5f2d 100644 --- a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMProviderInfo.java +++ b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/PNMProviderInfo.java @@ -30,7 +30,7 @@ package com.twelvemonkeys.imageio.plugins.pnm; -import com.twelvemonkeys.imageio.spi.ProviderInfo; +import com.twelvemonkeys.imageio.spi.ReaderWriterProviderInfo; /** * PNMProviderInfo. @@ -39,11 +39,35 @@ import com.twelvemonkeys.imageio.spi.ProviderInfo; * @author last modified by $Author: harald.kuhr$ * @version $Id: PNMProviderInfo.java,v 1.0 20/03/15 harald.kuhr Exp$ */ -class PNMProviderInfo extends ProviderInfo { - // NOTE: Because the ReaderSpi and the two WriterSpis supports different formats, - // we don't use the standard ImageReaderWriterProviderInfo superclass here. - +class PNMProviderInfo extends ReaderWriterProviderInfo { public PNMProviderInfo() { - super(PNMProviderInfo.class.getPackage()); + super(PNMProviderInfo.class, + new String[] { + "pnm", "pbm", "pgm", "ppm","pfm", + "PNM", "PBM", "PGM", "PPM", "PFM" + }, + new String[] {"pbm", "pgm", "ppm", "pfm"}, + new String[] { + // No official IANA record exists, these are conventional + "image/x-portable-pixmap", + "image/x-portable-anymap", + }, + "com.twelvemonkeys.imageio.plugins.pnm.PNMImageReader", + new String[] { + "com.twelvemonkeys.imageio.plugins.pnm.PNMImageReaderSpi", + "com.twelvemonkeys.imageio.plugins.pnm.PAMImageReaderSpi" + }, + "com.twelvemonkeys.imageio.plugins.pnm.PNMImageWriter", + new String[] { + "com.twelvemonkeys.imageio.plugins.pnm.PNMImageWriterSpi", + "com.twelvemonkeys.imageio.plugins.pnm.PAMImageWriterSpi" + }, + true, // supports standard stream metadata + null, null, // native stream format name and class + null, null, // extra stream formats + true, // supports standard image metadata + null, null, + null, null // extra image metadata formats + ); } } diff --git a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/Plain16BitDecoder.java b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/Plain16BitDecoder.java index 486e90f6..e759ea78 100755 --- a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/Plain16BitDecoder.java +++ b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/Plain16BitDecoder.java @@ -36,7 +36,7 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; final class Plain16BitDecoder extends InputStream { private final BufferedReader reader; @@ -45,7 +45,7 @@ final class Plain16BitDecoder extends InputStream { private int leftOver = -1; public Plain16BitDecoder(final InputStream in) { - reader = new BufferedReader(new InputStreamReader(in, Charset.forName("ASCII"))); + reader = new BufferedReader(new InputStreamReader(in, StandardCharsets.US_ASCII)); } @Override diff --git a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/Plain1BitDecoder.java b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/Plain1BitDecoder.java index 80e33232..41e35abb 100755 --- a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/Plain1BitDecoder.java +++ b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/Plain1BitDecoder.java @@ -43,6 +43,7 @@ final class Plain1BitDecoder extends InputStream { this.samplesPerRow = samplesPerRow; } + @SuppressWarnings("StatementWithEmptyBody") @Override public int read() throws IOException { // Each 0 or 1 represents one bit, whitespace is ignored. Padded to byte boundary for each row. diff --git a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/Plain8BitDecoder.java b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/Plain8BitDecoder.java index 8f2409b0..3d419273 100755 --- a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/Plain8BitDecoder.java +++ b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/Plain8BitDecoder.java @@ -36,7 +36,7 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; final class Plain8BitDecoder extends InputStream { private final BufferedReader reader; @@ -44,7 +44,7 @@ final class Plain8BitDecoder extends InputStream { private StringTokenIterator currentLine; public Plain8BitDecoder(final InputStream in) { - reader = new BufferedReader(new InputStreamReader(in, Charset.forName("ASCII"))); + reader = new BufferedReader(new InputStreamReader(in, StandardCharsets.US_ASCII)); } @Override diff --git a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/TupleType.java b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/TupleType.java index 6ceccfa4..7852b5eb 100755 --- a/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/TupleType.java +++ b/imageio/imageio-pnm/src/main/java/com/twelvemonkeys/imageio/plugins/pnm/TupleType.java @@ -34,9 +34,9 @@ import java.awt.*; enum TupleType { // Official: - /** B/W, but uses 1 byte (8 bits) per pixel. Black is zero (oposite of PBM) */ + /** B/W, but uses 1 byte (8 bits) per pixel. Black is zero (opposite of PBM) */ BLACKANDWHITE(1, 1, PNM.MAX_VAL_1BIT, Transparency.OPAQUE), - /** B/W + bit mask, uses 2 bytes per pixel. Black is zero (oposite of PBM) */ + /** B/W + bit mask, uses 2 bytes per pixel. Black is zero (opposite of PBM) */ BLACKANDWHITE_ALPHA(2, PNM.MAX_VAL_1BIT, PNM.MAX_VAL_1BIT, Transparency.BITMASK), /** Grayscale, as PGM. */ GRAYSCALE(1, 2, PNM.MAX_VAL_16BIT, Transparency.OPAQUE), @@ -80,5 +80,4 @@ enum TupleType { public boolean isValidMaxSample(int maxSample) { return maxSample >= minMaxSample && maxSample <= maxMaxSample; } - } diff --git a/imageio/imageio-pnm/src/main/resources/META-INF/services/javax.imageio.spi.ImageReaderSpi b/imageio/imageio-pnm/src/main/resources/META-INF/services/javax.imageio.spi.ImageReaderSpi index 9af30edc..137417c1 100755 --- a/imageio/imageio-pnm/src/main/resources/META-INF/services/javax.imageio.spi.ImageReaderSpi +++ b/imageio/imageio-pnm/src/main/resources/META-INF/services/javax.imageio.spi.ImageReaderSpi @@ -1 +1,2 @@ com.twelvemonkeys.imageio.plugins.pnm.PNMImageReaderSpi +com.twelvemonkeys.imageio.plugins.pnm.PAMImageReaderSpi diff --git a/imageio/imageio-pnm/src/test/java/com/twelvemonkeys/imageio/plugins/pnm/PAMImageReaderSpiTest.java b/imageio/imageio-pnm/src/test/java/com/twelvemonkeys/imageio/plugins/pnm/PAMImageReaderSpiTest.java new file mode 100644 index 00000000..20b84eac --- /dev/null +++ b/imageio/imageio-pnm/src/test/java/com/twelvemonkeys/imageio/plugins/pnm/PAMImageReaderSpiTest.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2020, 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.pnm; + +import org.junit.Test; + +import javax.imageio.ImageReader; +import javax.imageio.spi.ImageReaderSpi; +import javax.imageio.spi.ImageWriterSpi; + +import static com.twelvemonkeys.imageio.spi.ReaderWriterProviderInfoTest.assertClassExists; +import static com.twelvemonkeys.imageio.spi.ReaderWriterProviderInfoTest.assertClassesExist; +import static org.junit.Assert.assertNotNull; + +/** + * PAMImageReaderSpiTest. + * + * @author Harald Kuhr + * @author last modified by $Author: harald.kuhr$ + * @version $Id: PAMImageReaderSpiTest.java,v 1.0 02/06/16 harald.kuhr Exp$ + */ +public class PAMImageReaderSpiTest { + + private final ImageReaderSpi spi = new PAMImageReaderSpi(); + + @Test + public void getPluginClassName() { + assertClassExists(spi.getPluginClassName(), ImageReader.class); + } + + @Test + public void getImageWriterSpiNames() { + assertClassesExist(spi.getImageWriterSpiNames(), ImageWriterSpi.class); + } + + @Test + public void getInputTypes() { + assertNotNull(spi.getInputTypes()); + } +} \ No newline at end of file diff --git a/imageio/imageio-pnm/src/test/java/com/twelvemonkeys/imageio/plugins/pnm/PAMImageReaderTest.java b/imageio/imageio-pnm/src/test/java/com/twelvemonkeys/imageio/plugins/pnm/PAMImageReaderTest.java new file mode 100755 index 00000000..83e59bae --- /dev/null +++ b/imageio/imageio-pnm/src/test/java/com/twelvemonkeys/imageio/plugins/pnm/PAMImageReaderTest.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2020, 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.pnm; + +import com.twelvemonkeys.imageio.util.ImageReaderAbstractTest; + +import org.junit.Test; + +import javax.imageio.ImageReader; +import javax.imageio.spi.ImageReaderSpi; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class PAMImageReaderTest extends ImageReaderAbstractTest { + @Override + protected ImageReaderSpi createProvider() { + return new PAMImageReaderSpi(); + } + + @Override + protected List getTestData() { + return Arrays.asList( + new TestData(getClassLoaderResource("/pam/lena.pam"), new Dimension(128, 128)), // P7 RGB + new TestData(getClassLoaderResource("/pam/rgba.pam"), new Dimension(4, 2)) // P7 RGB_ALPHA + ); + } + + @Override + protected List getFormatNames() { + return Arrays.asList( + "pam", + "PAM" + ); + } + + @Override + protected List getSuffixes() { + return Collections.singletonList( + "pam" + ); + } + + @Override + protected List getMIMETypes() { + return Collections.singletonList( + "image/x-portable-arbitrarymap" + ); + } + + @Test + public void testRGBAVsReference() throws IOException { + ImageReader reader = createReader(); + TestData data = new TestData(getClassLoaderResource("/pam/rgba.pam"), new Dimension(4, 2)); + reader.setInput(data.getInputStream()); + + BufferedImage expected = new BufferedImage(4, 2, BufferedImage.TYPE_4BYTE_ABGR); + + expected.setRGB(0, 0, new Color(0, 0, 255).getRGB()); + expected.setRGB(1, 0, new Color(0, 255, 0).getRGB()); + expected.setRGB(2, 0, new Color(255, 0, 0).getRGB()); + expected.setRGB(3, 0, new Color(255, 255, 255).getRGB()); + + expected.setRGB(0, 1, new Color(0, 0, 255, 127).getRGB()); + expected.setRGB(1, 1, new Color(0, 255, 0, 127).getRGB()); + expected.setRGB(2, 1, new Color(255, 0, 0, 127).getRGB()); + expected.setRGB(3, 1, new Color(255, 255, 255, 127).getRGB()); + + assertImageDataEquals("Images differ from reference", expected, reader.read(0)); + } + + @Test + public void testXVThumbNotIncorrectlyRecognizedAsPAM() throws IOException { + assertTrue("Should recognize PAM format", provider.canDecodeInput(new TestData(getClassLoaderResource("/pam/rgba.pam"), new Dimension()).getInputStream())); // Sanity + assertFalse("Should distinguish xv-thumbs from PAM format", provider.canDecodeInput(new TestData(getClassLoaderResource("/xv-thumb/xv-thumb.xvt"), new Dimension()).getInputStream())); + } +} diff --git a/imageio/imageio-pnm/src/test/java/com/twelvemonkeys/imageio/plugins/pnm/PAMProviderInfoTest.java b/imageio/imageio-pnm/src/test/java/com/twelvemonkeys/imageio/plugins/pnm/PAMProviderInfoTest.java new file mode 100644 index 00000000..da6fd2ed --- /dev/null +++ b/imageio/imageio-pnm/src/test/java/com/twelvemonkeys/imageio/plugins/pnm/PAMProviderInfoTest.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2020, 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.pnm; + +import com.twelvemonkeys.imageio.spi.ReaderWriterProviderInfo; +import com.twelvemonkeys.imageio.spi.ReaderWriterProviderInfoTest; + +/** + * PAMProviderInfoTest. + * + * @author Harald Kuhr + * @author last modified by $Author: harald.kuhr$ + * @version $Id: PAMProviderInfoTest.java,v 1.0 02/06/16 harald.kuhr Exp$ + */ +public class PAMProviderInfoTest extends ReaderWriterProviderInfoTest { + @Override + protected ReaderWriterProviderInfo createProviderInfo() { + return new PAMProviderInfo(); + } +} \ No newline at end of file diff --git a/imageio/imageio-pnm/src/test/java/com/twelvemonkeys/imageio/plugins/pnm/PNMImageReaderTest.java b/imageio/imageio-pnm/src/test/java/com/twelvemonkeys/imageio/plugins/pnm/PNMImageReaderTest.java index 6be6ccfd..967285ec 100755 --- a/imageio/imageio-pnm/src/test/java/com/twelvemonkeys/imageio/plugins/pnm/PNMImageReaderTest.java +++ b/imageio/imageio-pnm/src/test/java/com/twelvemonkeys/imageio/plugins/pnm/PNMImageReaderTest.java @@ -41,9 +41,6 @@ import java.io.IOException; import java.util.Arrays; import java.util.List; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - public class PNMImageReaderTest extends ImageReaderAbstractTest { @Override protected ImageReaderSpi createProvider() { @@ -60,8 +57,6 @@ public class PNMImageReaderTest extends ImageReaderAbstractTest new TestData(getClassLoaderResource("/pgm/feep16.pgm"), new Dimension(24, 7)), // P2 (PGM PLAIN, 16 bits/sample) new TestData(getClassLoaderResource("/pgm/house.l.pgm"), new Dimension(367, 241)), // P5 (PGM RAW) new TestData(getClassLoaderResource("/ppm/lighthouse_rgb48.ppm"), new Dimension(768, 512)), // P6 (PPM RAW, 16 bits/sample) - new TestData(getClassLoaderResource("/pam/lena.pam"), new Dimension(128, 128)), // P7 RGB - new TestData(getClassLoaderResource("/pam/rgba.pam"), new Dimension(4, 2)), // P7 RGB_ALPHA new TestData(getClassLoaderResource("/pfm/memorial.pfm"), new Dimension(512, 768)) // PF (32 bits/sample, floating point) ); } @@ -69,15 +64,15 @@ public class PNMImageReaderTest extends ImageReaderAbstractTest @Override protected List getFormatNames() { return Arrays.asList( - "pnm", "pbm", "pgm", "ppm", "pam", - "PNM", "PBM", "PGM", "PPM", "PAM" + "pnm", "pbm", "pgm", "ppm", "pfm", + "PNM", "PBM", "PGM", "PPM", "PFM" ); } @Override protected List getSuffixes() { return Arrays.asList( - "pbm", "pgm", "ppm", "pam" + "pbm", "pgm", "ppm", "pfm" ); } @@ -85,8 +80,7 @@ public class PNMImageReaderTest extends ImageReaderAbstractTest protected List getMIMETypes() { return Arrays.asList( "image/x-portable-pixmap", - "image/x-portable-anymap", - "image/x-portable-arbitrarymap" + "image/x-portable-anymap" ); } @@ -108,31 +102,4 @@ public class PNMImageReaderTest extends ImageReaderAbstractTest assertImageDataEquals("Images differ from reference", expected, reader.read(0)); } - - @Test - public void testRGBAVsReference() throws IOException { - ImageReader reader = createReader(); - TestData data = new TestData(getClassLoaderResource("/pam/rgba.pam"), new Dimension(4, 2)); - reader.setInput(data.getInputStream()); - - BufferedImage expected = new BufferedImage(4, 2, BufferedImage.TYPE_4BYTE_ABGR); - - expected.setRGB(0, 0, new Color(0, 0, 255).getRGB()); - expected.setRGB(1, 0, new Color(0, 255, 0).getRGB()); - expected.setRGB(2, 0, new Color(255, 0, 0).getRGB()); - expected.setRGB(3, 0, new Color(255, 255, 255).getRGB()); - - expected.setRGB(0, 1, new Color(0, 0, 255, 127).getRGB()); - expected.setRGB(1, 1, new Color(0, 255, 0, 127).getRGB()); - expected.setRGB(2, 1, new Color(255, 0, 0, 127).getRGB()); - expected.setRGB(3, 1, new Color(255, 255, 255, 127).getRGB()); - - assertImageDataEquals("Images differ from reference", expected, reader.read(0)); - } - - @Test - public void testXVThumbNotIncorrectlyRecognizedAsPAM() throws IOException { - assertTrue("Should recognize PAM format", provider.canDecodeInput(new TestData(getClassLoaderResource("/pam/rgba.pam"), new Dimension()).getInputStream())); // Sanity - assertFalse("Should distinguish xv-thumbs from PAM format", provider.canDecodeInput(new TestData(getClassLoaderResource("/xv-thumb/xv-thumb.xvt"), new Dimension()).getInputStream())); - } } diff --git a/imageio/imageio-pnm/src/test/java/com/twelvemonkeys/imageio/plugins/pnm/PNMProviderInfoTest.java b/imageio/imageio-pnm/src/test/java/com/twelvemonkeys/imageio/plugins/pnm/PNMProviderInfoTest.java index 03539d55..cfa738bd 100644 --- a/imageio/imageio-pnm/src/test/java/com/twelvemonkeys/imageio/plugins/pnm/PNMProviderInfoTest.java +++ b/imageio/imageio-pnm/src/test/java/com/twelvemonkeys/imageio/plugins/pnm/PNMProviderInfoTest.java @@ -30,9 +30,8 @@ package com.twelvemonkeys.imageio.plugins.pnm; -import org.junit.Test; - -import static org.junit.Assert.assertNotNull; +import com.twelvemonkeys.imageio.spi.ReaderWriterProviderInfo; +import com.twelvemonkeys.imageio.spi.ReaderWriterProviderInfoTest; /** * PNMProviderInfoTest. @@ -41,11 +40,9 @@ import static org.junit.Assert.assertNotNull; * @author last modified by $Author: harald.kuhr$ * @version $Id: PNMProviderInfoTest.java,v 1.0 02/06/16 harald.kuhr Exp$ */ -public class PNMProviderInfoTest { - @Test - public void vendorVersion() { - PNMProviderInfo providerInfo = new PNMProviderInfo(); - assertNotNull(providerInfo.getVendorName()); - assertNotNull(providerInfo.getVersion()); +public class PNMProviderInfoTest extends ReaderWriterProviderInfoTest { + @Override + protected ReaderWriterProviderInfo createProviderInfo() { + return new PNMProviderInfo(); } } \ No newline at end of file