Simplified/optimized TIFF file recognition code.

This commit is contained in:
Harald Kuhr
2021-03-30 11:29:05 +02:00
parent 0011b9a480
commit bc07524e7a

View File

@@ -36,8 +36,8 @@ import com.twelvemonkeys.imageio.spi.ImageReaderSpiBase;
import javax.imageio.spi.ImageReaderSpi; import javax.imageio.spi.ImageReaderSpi;
import javax.imageio.spi.ServiceRegistry; import javax.imageio.spi.ServiceRegistry;
import javax.imageio.stream.ImageInputStream; import javax.imageio.stream.ImageInputStream;
import java.io.EOFException;
import java.io.IOException; import java.io.IOException;
import java.nio.ByteOrder;
import java.util.Locale; import java.util.Locale;
import static com.twelvemonkeys.imageio.util.IIOUtil.lookupProviderByName; import static com.twelvemonkeys.imageio.util.IIOUtil.lookupProviderByName;
@@ -75,7 +75,7 @@ public final class TIFFImageReaderSpi extends ImageReaderSpiBase {
return canDecodeAs(pSource, TIFF.TIFF_MAGIC); return canDecodeAs(pSource, TIFF.TIFF_MAGIC);
} }
static boolean canDecodeAs(final Object pSource, final int magic) throws IOException { static boolean canDecodeAs(final Object pSource, final int versionMagic) throws IOException {
if (!(pSource instanceof ImageInputStream)) { if (!(pSource instanceof ImageInputStream)) {
return false; return false;
} }
@@ -84,27 +84,14 @@ public final class TIFFImageReaderSpi extends ImageReaderSpiBase {
stream.mark(); stream.mark();
try { try {
byte[] bom = new byte[2]; byte[] magic = new byte[4];
stream.readFully(bom); stream.readFully(magic);
ByteOrder originalOrder = stream.getByteOrder(); return magic[0] == 'I' && magic[1] == 'I' && magic[2] == (versionMagic & 0xFF) && magic[3] == (versionMagic >>> 8)
|| magic[0] == 'M' && magic[1] == 'M' && magic[2] == (versionMagic >>> 8) && magic[3] == (versionMagic & 0xFF);
try { }
if (bom[0] == 'I' && bom[1] == 'I') { catch (EOFException ignore) {
stream.setByteOrder(ByteOrder.LITTLE_ENDIAN); return false;
}
else if (bom[0] == 'M' && bom[1] == 'M') {
stream.setByteOrder(ByteOrder.BIG_ENDIAN);
}
else {
return false;
}
return stream.readUnsignedShort() == magic;
}
finally {
stream.setByteOrder(originalOrder);
}
} }
finally { finally {
stream.reset(); stream.reset();