PNM Windows issue. Temporary roll-back to working version.

This commit is contained in:
Harald Kuhr 2022-02-14 19:33:28 +01:00
parent 5347015cbd
commit a3e6e52c95
2 changed files with 37 additions and 67 deletions

View File

@ -30,10 +30,8 @@
package com.twelvemonkeys.imageio.plugins.pnm; package com.twelvemonkeys.imageio.plugins.pnm;
import com.twelvemonkeys.io.FastByteArrayOutputStream; import javax.imageio.IIOException;
import javax.imageio.stream.ImageInputStream; import javax.imageio.stream.ImageInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -72,74 +70,45 @@ final class PNMHeaderParser extends HeaderParser {
List<String> comments = new ArrayList<>(); List<String> comments = new ArrayList<>();
StringBuilder tokenBuffer = new StringBuilder();
while (width == 0 || height == 0 || maxSample == 0) { while (width == 0 || height == 0 || maxSample == 0) {
tokenBuffer.delete(0, tokenBuffer.length()); String line = input.readLine();
while (tokenBuffer.length() < 16) { // Limit reads if we should read across into the binary part... if (line == null) {
byte read = input.readByte(); throw new IIOException("Unexpected end of stream");
if (read == '#') {
// Read rest of the line as comment
String comment = readLineUTF8(input).trim();
if (!comment.isEmpty()) {
comments.add(comment);
}
break;
}
else if (Character.isWhitespace((char) read)) {
if (tokenBuffer.length() > 0) {
break;
}
}
else {
tokenBuffer.append((char) read);
}
} }
String token = tokenBuffer.toString().trim(); int commentStart = line.indexOf('#');
if (commentStart >= 0) {
String comment = line.substring(commentStart + 1).trim();
if (!comment.isEmpty()) {
comments.add(comment);
}
if (!token.isEmpty()) { line = line.substring(0, commentStart);
}
line = line.trim();
if (!line.isEmpty()) {
// We have tokens... // We have tokens...
if (width == 0) { String[] tokens = line.split("\\s");
width = Integer.parseInt(token); for (String token : tokens) {
} if (width == 0) {
else if (height == 0) { width = Integer.parseInt(token);
height = Integer.parseInt(token); }
} else if (height == 0) {
else { height = Integer.parseInt(token);
maxSample = Integer.parseInt(token); }
else if (maxSample == 0) {
maxSample = Integer.parseInt(token);
}
else {
throw new IIOException("Unknown PNM token: " + token);
}
} }
} }
} }
return new PNMHeader(fileType, tupleType, width, height, tupleType.getSamplesPerPixel(), maxSample, comments); return new PNMHeader(fileType, tupleType, width, height, tupleType.getSamplesPerPixel(), maxSample, comments);
} }
// Similar to DataInput.readLine, except it uses UTF8 encoding
private static String readLineUTF8(final ImageInputStream input) throws IOException {
ByteArrayOutputStream buffer = new FastByteArrayOutputStream(128);
int value;
do {
switch (value = input.read()) {
case '\r':
// Check for CR + LF pattern and skip, otherwise fall through
if (input.read() != '\n') {
input.seek(input.getStreamPosition() - 1);
}
case '\n':
case -1:
value = -1;
break;
default:
buffer.write(value);
}
} while (value != -1);
return buffer.toString("UTF8");
}
} }

View File

@ -52,12 +52,13 @@ public class PNMImageReaderTest extends ImageReaderAbstractTest<PNMImageReader>
@Override @Override
protected List<TestData> getTestData() { protected List<TestData> getTestData() {
return Arrays.asList( return Arrays.asList(
new TestData(getClassLoaderResource("/ppm/snail2.pnm"), new Dimension(256, 256)), // P6 (PPM RAW) new TestData(getClassLoaderResource("/ppm/lighthouse_rgb48.ppm"), new Dimension(768, 512)), // P6 (PPM RAW, 16 bits/sample)
// new TestData(getClassLoaderResource("/ppm/snail2.pnm"), new Dimension(256, 256)), // P6 (PPM RAW)
new TestData(getClassLoaderResource("/ppm/colors.ppm"), new Dimension(3, 2)), // P3 (PPM PLAIN) new TestData(getClassLoaderResource("/ppm/colors.ppm"), new Dimension(3, 2)), // P3 (PPM PLAIN)
new TestData(getClassLoaderResource("/pbm/j.pbm"), new Dimension(6, 10)), // P1 (PBM PLAIN) new TestData(getClassLoaderResource("/pbm/j.pbm"), new Dimension(6, 10)), // P1 (PBM PLAIN)
new TestData(getClassLoaderResource("/pbm/circle2.pnm"), new Dimension(200, 200)), // P4 (PBM RAW) // new TestData(getClassLoaderResource("/pbm/circle2.pnm"), new Dimension(200, 200)), // P4 (PBM RAW)
new TestData(getClassLoaderResource("/pgm/feep.pgm"), new Dimension(24, 7)), // P2 (PGM PLAIN) new TestData(getClassLoaderResource("/pgm/feep.pgm"), new Dimension(24, 7)), // P2 (PGM PLAIN)
new TestData(getClassLoaderResource("/pgm/rays2.pnm"), new Dimension(200, 200)), // P4 (PGM RAW) // new TestData(getClassLoaderResource("/pgm/rays2.pnm"), new Dimension(200, 200)), // P4 (PGM RAW)
new TestData(getClassLoaderResource("/pgm/feep16.pgm"), new Dimension(24, 7)), // P2 (PGM PLAIN, 16 bits/sample) 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("/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("/ppm/lighthouse_rgb48.ppm"), new Dimension(768, 512)), // P6 (PPM RAW, 16 bits/sample)
@ -68,12 +69,12 @@ public class PNMImageReaderTest extends ImageReaderAbstractTest<PNMImageReader>
@Override @Override
protected List<TestData> getTestDataForAffineTransformOpCompatibility() { protected List<TestData> getTestDataForAffineTransformOpCompatibility() {
return Arrays.asList( return Arrays.asList(
new TestData(getClassLoaderResource("/ppm/snail2.pnm"), new Dimension(256, 256)), // P6 (PPM RAW) // new TestData(getClassLoaderResource("/ppm/snail2.pnm"), new Dimension(256, 256)), // P6 (PPM RAW)
new TestData(getClassLoaderResource("/ppm/colors.ppm"), new Dimension(3, 2)), // P3 (PPM PLAIN) new TestData(getClassLoaderResource("/ppm/colors.ppm"), new Dimension(3, 2)), // P3 (PPM PLAIN)
new TestData(getClassLoaderResource("/pbm/j.pbm"), new Dimension(6, 10)), // P1 (PBM PLAIN) new TestData(getClassLoaderResource("/pbm/j.pbm"), new Dimension(6, 10)), // P1 (PBM PLAIN)
new TestData(getClassLoaderResource("/pbm/circle2.pnm"), new Dimension(200, 200)), // P4 (PBM RAW) // new TestData(getClassLoaderResource("/pbm/circle2.pnm"), new Dimension(200, 200)), // P4 (PBM RAW)
new TestData(getClassLoaderResource("/pgm/feep.pgm"), new Dimension(24, 7)), // P2 (PGM PLAIN) new TestData(getClassLoaderResource("/pgm/feep.pgm"), new Dimension(24, 7)), // P2 (PGM PLAIN)
new TestData(getClassLoaderResource("/pgm/rays2.pnm"), new Dimension(200, 200)), // P4 (PGM RAW) // new TestData(getClassLoaderResource("/pgm/rays2.pnm"), new Dimension(200, 200)), // P4 (PGM RAW)
new TestData(getClassLoaderResource("/pgm/feep16.pgm"), new Dimension(24, 7)), // P2 (PGM PLAIN, 16 bits/sample) 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("/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("/ppm/lighthouse_rgb48.ppm"), new Dimension(768, 512)) // P6 (PPM RAW, 16 bits/sample)