From e68ce7ffd1d3211170b340f2b4eab745f9ead657 Mon Sep 17 00:00:00 2001 From: Koen De Groote Date: Fri, 3 Sep 2021 16:19:05 +0200 Subject: [PATCH] Certain pixeldepth-16 TGA files fail to process, classcast exception (#624) * Added fixed for monochrome tga16 bit. Uncertain if that description is complete. Test files added. Without the changed code, the tests fail. * Fix suggested by HaraldK Co-authored-by: Koen De Groote --- .../imageio/plugins/tga/TGAImageReader.java | 8 +++++++- .../imageio/plugins/tga/TGAImageReaderTest.java | 5 ++++- .../test/resources/tga/monochrome16_top_left.tga | Bin 0 -> 8236 bytes .../resources/tga/monochrome16_top_left_rle.tga | Bin 0 -> 5294 bytes 4 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 imageio/imageio-tga/src/test/resources/tga/monochrome16_top_left.tga create mode 100644 imageio/imageio-tga/src/test/resources/tga/monochrome16_top_left_rle.tga diff --git a/imageio/imageio-tga/src/main/java/com/twelvemonkeys/imageio/plugins/tga/TGAImageReader.java b/imageio/imageio-tga/src/main/java/com/twelvemonkeys/imageio/plugins/tga/TGAImageReader.java index 17f82958..596c99eb 100755 --- a/imageio/imageio-tga/src/main/java/com/twelvemonkeys/imageio/plugins/tga/TGAImageReader.java +++ b/imageio/imageio-tga/src/main/java/com/twelvemonkeys/imageio/plugins/tga/TGAImageReader.java @@ -116,7 +116,13 @@ final class TGAImageReader extends ImageReaderBase { return ImageTypeSpecifiers.createFromIndexColorModel(header.getColorMap()); case TGA.IMAGETYPE_MONOCHROME: case TGA.IMAGETYPE_MONOCHROME_RLE: - return ImageTypeSpecifiers.createGrayscale(8, DataBuffer.TYPE_BYTE); + switch (header.getPixelDepth()) { + case 8: + return ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_BYTE_GRAY); + case 16: + return ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_USHORT_GRAY); + default: throw new IIOException("Unknown pixel depth for monochrome: " + header.getPixelDepth()); + } case TGA.IMAGETYPE_TRUECOLOR: case TGA.IMAGETYPE_TRUECOLOR_RLE: ColorSpace sRGB = ColorSpace.getInstance(ColorSpace.CS_sRGB); diff --git a/imageio/imageio-tga/src/test/java/com/twelvemonkeys/imageio/plugins/tga/TGAImageReaderTest.java b/imageio/imageio-tga/src/test/java/com/twelvemonkeys/imageio/plugins/tga/TGAImageReaderTest.java index 0b3d1f71..14a94df9 100755 --- a/imageio/imageio-tga/src/test/java/com/twelvemonkeys/imageio/plugins/tga/TGAImageReaderTest.java +++ b/imageio/imageio-tga/src/test/java/com/twelvemonkeys/imageio/plugins/tga/TGAImageReaderTest.java @@ -91,7 +91,10 @@ public class TGAImageReaderTest extends ImageReaderAbstractTest new TestData(getClassLoaderResource("/tga/XING_T24.TGA"), new Dimension(240, 164)), // Uncompressed 24 bit BGR top/down new TestData(getClassLoaderResource("/tga/XING_T32.TGA"), new Dimension(240, 164)), // Uncompressed 32 bit BGRA top/down - new TestData(getClassLoaderResource("/tga/autodesk-3dsmax-extsize494.tga"), new Dimension(440, 200)) // RLE compressed 32 bit BGRA bottom/up + new TestData(getClassLoaderResource("/tga/autodesk-3dsmax-extsize494.tga"), new Dimension(440, 200)), // RLE compressed 32 bit BGRA bottom/up + + new TestData(getClassLoaderResource("/tga/monochrome16_top_left.tga"), new Dimension(64, 64)), // Uncompressed 16 bit monochrome + new TestData(getClassLoaderResource("/tga/monochrome16_top_left_rle.tga"), new Dimension(64, 64)) // RLE compressed 16 bit monochrome ); } diff --git a/imageio/imageio-tga/src/test/resources/tga/monochrome16_top_left.tga b/imageio/imageio-tga/src/test/resources/tga/monochrome16_top_left.tga new file mode 100644 index 0000000000000000000000000000000000000000..af30bc5a5f11ca540d5e6e884fcd8a39bba240a3 GIT binary patch literal 8236 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 NcmMp>+eX}|{{y=z@b>@! literal 0 HcmV?d00001