diff --git a/.gitignore b/.gitignore index 261c0f76..1179050c 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ profiles.xml Thumbs.db .DS_Store /.metadata/ +.run/ diff --git a/.run/DDSImageReader.run.xml b/.run/DDSImageReader.run.xml new file mode 100644 index 00000000..e2b381bd --- /dev/null +++ b/.run/DDSImageReader.run.xml @@ -0,0 +1,15 @@ + + + + \ No newline at end of file diff --git a/imageio/imageio-dds/src/main/java/com/twelvemonkeys/imageio/plugins/dds/DDSHeader.java b/imageio/imageio-dds/src/main/java/com/twelvemonkeys/imageio/plugins/dds/DDSHeader.java index b32d0808..ff879fe4 100644 --- a/imageio/imageio-dds/src/main/java/com/twelvemonkeys/imageio/plugins/dds/DDSHeader.java +++ b/imageio/imageio-dds/src/main/java/com/twelvemonkeys/imageio/plugins/dds/DDSHeader.java @@ -25,66 +25,61 @@ public final class DDSHeader { public static DDSHeader read(final ImageInputStream imageInput) throws IOException { DDSHeader header = new DDSHeader(); - imageInput.mark(); + imageInput.setByteOrder(ByteOrder.LITTLE_ENDIAN); - try { - imageInput.setByteOrder(ByteOrder.LITTLE_ENDIAN); - - // Read MAGIC bytes [0,3] - byte[] magic = new byte[DDS.MAGIC.length]; - imageInput.readFully(magic); - if (!Arrays.equals(DDS.MAGIC, magic)) { - throw new IIOException("Unsupported MAGIC bytes."); - } - - // DDS_HEADER structure - // https://learn.microsoft.com/en-us/windows/win32/direct3ddds/dds-header - int dwSize = imageInput.readInt(); // [4,7] - if (dwSize != DDS.HEADER_SIZE) { - throw new IIOException("Invalid header size: " + dwSize); - } - - // Verify flags - header.flags = imageInput.readInt(); // [8,11] - if (header.getFlag(DDS.FLAG_CAPS - & DDS.FLAG_HEIGHT - & DDS.FLAG_WIDTH - & DDS.FLAG_PIXELFORMAT)) { - throw new IIOException("Required DDS Flag missing in header: " + Integer.toHexString(header.flags)); - } - - // Read Height & Width - header.height = imageInput.readInt(); // [12,15] - header.width = imageInput.readInt(); // [16,19] - - - int dwPitchOrLinearSize = imageInput.readInt(); // [20,23] - int dwDepth = imageInput.readInt(); // [24,27] - header.mipmap = imageInput.readInt(); // [28,31] - - byte[] dwReserved1 = new byte[11 * 4]; // [32,75] - imageInput.readFully(dwReserved1); - - // DDS_PIXELFORMAT structure - int px_dwSize = imageInput.readInt(); // [76,79] - - header.pixelFormatFlags = imageInput.readInt(); // [80,83] - header.fourCC = imageInput.readInt(); // [84,87] - header.bitCount = imageInput.readInt(); // [88,91] - header.redMask = imageInput.readInt(); // [92,95] - header.greenMask = imageInput.readInt(); // [96,99] - header.blueMask = imageInput.readInt(); // [100,103] - header.alphaMask = imageInput.readInt(); // [104,107] - - int dwCaps = imageInput.readInt(); - int dwCaps2 = imageInput.readInt(); - int dwCaps3 = imageInput.readInt(); - int dwCaps4 = imageInput.readInt(); - - int dwReserved2 = imageInput.readInt(); - } finally { - imageInput.reset(); + // Read MAGIC bytes [0,3] + byte[] magic = new byte[DDS.MAGIC.length]; + imageInput.readFully(magic); + if (!Arrays.equals(DDS.MAGIC, magic)) { + throw new IIOException("Unsupported MAGIC bytes."); } + + // DDS_HEADER structure + // https://learn.microsoft.com/en-us/windows/win32/direct3ddds/dds-header + int dwSize = imageInput.readInt(); // [4,7] + if (dwSize != DDS.HEADER_SIZE) { + throw new IIOException("Invalid header size: " + dwSize); + } + + // Verify flags + header.flags = imageInput.readInt(); // [8,11] + if (header.getFlag(DDS.FLAG_CAPS + & DDS.FLAG_HEIGHT + & DDS.FLAG_WIDTH + & DDS.FLAG_PIXELFORMAT)) { + throw new IIOException("Required DDS Flag missing in header: " + Integer.toHexString(header.flags)); + } + + // Read Height & Width + header.height = imageInput.readInt(); // [12,15] + header.width = imageInput.readInt(); // [16,19] + + + int dwPitchOrLinearSize = imageInput.readInt(); // [20,23] + int dwDepth = imageInput.readInt(); // [24,27] + header.mipmap = imageInput.readInt(); // [28,31] + + byte[] dwReserved1 = new byte[11 * 4]; // [32,75] + imageInput.readFully(dwReserved1); + + // DDS_PIXELFORMAT structure + int px_dwSize = imageInput.readInt(); // [76,79] + + header.pixelFormatFlags = imageInput.readInt(); // [80,83] + header.fourCC = imageInput.readInt(); // [84,87] + header.bitCount = imageInput.readInt(); // [88,91] + header.redMask = imageInput.readInt(); // [92,95] + header.greenMask = imageInput.readInt(); // [96,99] + header.blueMask = imageInput.readInt(); // [100,103] + header.alphaMask = imageInput.readInt(); // [104,107] + + int dwCaps = imageInput.readInt(); // [108,111] + int dwCaps2 = imageInput.readInt(); // [112,115] + int dwCaps3 = imageInput.readInt(); // [116,119] + int dwCaps4 = imageInput.readInt(); // [120,123] + + int dwReserved2 = imageInput.readInt(); // [124,127] + return header; } diff --git a/imageio/imageio-dds/src/main/java/com/twelvemonkeys/imageio/plugins/dds/DDSImageReader.java b/imageio/imageio-dds/src/main/java/com/twelvemonkeys/imageio/plugins/dds/DDSImageReader.java index ea35183d..ca2aea1c 100644 --- a/imageio/imageio-dds/src/main/java/com/twelvemonkeys/imageio/plugins/dds/DDSImageReader.java +++ b/imageio/imageio-dds/src/main/java/com/twelvemonkeys/imageio/plugins/dds/DDSImageReader.java @@ -10,8 +10,10 @@ import javax.imageio.spi.ImageReaderSpi; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; +import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; +import java.util.List; public final class DDSImageReader extends ImageReaderBase { @@ -68,12 +70,8 @@ public final class DDSImageReader extends ImageReaderBase { BufferedImage destination = getDestination(param, getImageTypes(imageIndex), width, height); - // TODO - byte[] buffer = new byte[width * height * 4]; - imageInput.read(buffer); - DDSReader dds = new DDSReader(header); - int[] pixels = dds.read(buffer, 0); + int[] pixels = dds.read(imageInput, 0); destination.setRGB(0, 0, width, height, pixels, 0, width); processImageComplete(); @@ -92,11 +90,45 @@ public final class DDSImageReader extends ImageReaderBase { } public static void main(final String[] args) throws IOException { - File file = new File("imageio/imageio-dds/src/test/resources/dds/stones.dxt5.dds"); - //File file = new File("imageio/imageio-dds/src/test/resources/dds/dxt1-noalpha.dds"); - BufferedImage image = ImageIO.read(file); + String parentDir = "imageio/imageio-dds/src/test/resources/dds"; + + List testFiles = new ArrayList<>(); + testFiles.add(new File(parentDir, "dds_A1R5G5B5.dds")); + testFiles.add(new File(parentDir, "dds_A1R5G5B5_mipmap.dds")); + testFiles.add(new File(parentDir, "dds_A4R4G4B4.dds")); + testFiles.add(new File(parentDir, "dds_A4R4G4B4_mipmap.dds")); + testFiles.add(new File(parentDir, "dds_A8B8G8R8.dds")); + testFiles.add(new File(parentDir, "dds_A8B8G8R8_mipmap.dds")); + testFiles.add(new File(parentDir, "dds_A8R8G8B8.dds")); + testFiles.add(new File(parentDir, "dds_A8R8G8B8_mipmap.dds")); + testFiles.add(new File(parentDir, "dds_DXT1.dds")); + testFiles.add(new File(parentDir, "dds_DXT1_mipmap.dds")); + testFiles.add(new File(parentDir, "dds_DXT2.dds")); + testFiles.add(new File(parentDir, "dds_DXT2_mipmap.dds")); + testFiles.add(new File(parentDir, "dds_DXT3.dds")); + testFiles.add(new File(parentDir, "dds_DXT3_mipmap.dds")); + testFiles.add(new File(parentDir, "dds_DXT4.dds")); + testFiles.add(new File(parentDir, "dds_DXT4_mipmap.dds")); + testFiles.add(new File(parentDir, "dds_DXT5.dds")); + testFiles.add(new File(parentDir, "dds_DXT5_mipmap.dds")); + testFiles.add(new File(parentDir, "dds_R5G6B5.dds")); + testFiles.add(new File(parentDir, "dds_R5G6B5_mipmap.dds")); + testFiles.add(new File(parentDir, "dds_R8G8B8.dds")); + testFiles.add(new File(parentDir, "dds_R8G8B8_mipmap.dds")); + testFiles.add(new File(parentDir, "dds_X1R5G5B5.dds")); + testFiles.add(new File(parentDir, "dds_X1R5G5B5_mipmap.dds")); + testFiles.add(new File(parentDir, "dds_X4R4G4B4.dds")); + testFiles.add(new File(parentDir, "dds_X4R4G4B4_mipmap.dds")); + testFiles.add(new File(parentDir, "dds_X8B8G8R8.dds")); + testFiles.add(new File(parentDir, "dds_X8B8G8R8_mipmap.dds")); + testFiles.add(new File(parentDir, "dds_X8R8G8B8.dds")); + testFiles.add(new File(parentDir, "dds_X8R8G8B8_mipmap.dds")); + + for (File file : testFiles) { + BufferedImage image = ImageIO.read(file); + showIt(image, file.getName()); + } - showIt(image, file.getName()); } } diff --git a/imageio/imageio-dds/src/main/java/com/twelvemonkeys/imageio/plugins/dds/DDSReader.java b/imageio/imageio-dds/src/main/java/com/twelvemonkeys/imageio/plugins/dds/DDSReader.java index f69ed7fc..dddb9cee 100644 --- a/imageio/imageio-dds/src/main/java/com/twelvemonkeys/imageio/plugins/dds/DDSReader.java +++ b/imageio/imageio-dds/src/main/java/com/twelvemonkeys/imageio/plugins/dds/DDSReader.java @@ -14,6 +14,9 @@ package com.twelvemonkeys.imageio.plugins.dds; +import javax.imageio.stream.ImageInputStream; +import java.io.IOException; + public final class DDSReader { public static final Order order = new Order(16, 8, 0, 24); @@ -25,19 +28,22 @@ public final class DDSReader { this.header = header; } - public int[] read(byte[] buffer, int mipmapLevel) { + public int[] read(ImageInputStream imageInput, int mipmapLevel) throws IOException { // header int width = header.getWidth(); int height = header.getHeight(); int mipmap = header.getMipmap(); + byte[] buffer = new byte[width * height * 4]; + int len = imageInput.read(buffer); + // type int type = getType(header); if (type == 0) return null; // offset - int offset = 128; // header size + int offset = 0; // header size if (mipmapLevel > 0 && mipmapLevel < mipmap) { for (int i = 0; i < mipmapLevel; i++) { switch (type) { diff --git a/imageio/imageio-dds/src/test/resources/dds/dds_A1R5G5B5.dds b/imageio/imageio-dds/src/test/resources/dds/dds_A1R5G5B5.dds new file mode 100644 index 00000000..800ebd69 Binary files /dev/null and b/imageio/imageio-dds/src/test/resources/dds/dds_A1R5G5B5.dds differ diff --git a/imageio/imageio-dds/src/test/resources/dds/dds_A1R5G5B5_mipmap.dds b/imageio/imageio-dds/src/test/resources/dds/dds_A1R5G5B5_mipmap.dds new file mode 100644 index 00000000..9ae330b5 Binary files /dev/null and b/imageio/imageio-dds/src/test/resources/dds/dds_A1R5G5B5_mipmap.dds differ diff --git a/imageio/imageio-dds/src/test/resources/dds/dds_A4R4G4B4.dds b/imageio/imageio-dds/src/test/resources/dds/dds_A4R4G4B4.dds new file mode 100644 index 00000000..138efa11 Binary files /dev/null and b/imageio/imageio-dds/src/test/resources/dds/dds_A4R4G4B4.dds differ diff --git a/imageio/imageio-dds/src/test/resources/dds/dds_A4R4G4B4_mipmap.dds b/imageio/imageio-dds/src/test/resources/dds/dds_A4R4G4B4_mipmap.dds new file mode 100644 index 00000000..c4b64638 Binary files /dev/null and b/imageio/imageio-dds/src/test/resources/dds/dds_A4R4G4B4_mipmap.dds differ diff --git a/imageio/imageio-dds/src/test/resources/dds/dds_A8B8G8R8.dds b/imageio/imageio-dds/src/test/resources/dds/dds_A8B8G8R8.dds new file mode 100644 index 00000000..f9177668 Binary files /dev/null and b/imageio/imageio-dds/src/test/resources/dds/dds_A8B8G8R8.dds differ diff --git a/imageio/imageio-dds/src/test/resources/dds/dds_A8B8G8R8_mipmap.dds b/imageio/imageio-dds/src/test/resources/dds/dds_A8B8G8R8_mipmap.dds new file mode 100644 index 00000000..fc199300 Binary files /dev/null and b/imageio/imageio-dds/src/test/resources/dds/dds_A8B8G8R8_mipmap.dds differ diff --git a/imageio/imageio-dds/src/test/resources/dds/dds_A8R8G8B8.dds b/imageio/imageio-dds/src/test/resources/dds/dds_A8R8G8B8.dds new file mode 100644 index 00000000..ce5d6dc0 Binary files /dev/null and b/imageio/imageio-dds/src/test/resources/dds/dds_A8R8G8B8.dds differ diff --git a/imageio/imageio-dds/src/test/resources/dds/dds_A8R8G8B8_mipmap.dds b/imageio/imageio-dds/src/test/resources/dds/dds_A8R8G8B8_mipmap.dds new file mode 100644 index 00000000..f0b15def Binary files /dev/null and b/imageio/imageio-dds/src/test/resources/dds/dds_A8R8G8B8_mipmap.dds differ diff --git a/imageio/imageio-dds/src/test/resources/dds/dds_DXT1.dds b/imageio/imageio-dds/src/test/resources/dds/dds_DXT1.dds new file mode 100644 index 00000000..37e348ba Binary files /dev/null and b/imageio/imageio-dds/src/test/resources/dds/dds_DXT1.dds differ diff --git a/imageio/imageio-dds/src/test/resources/dds/dds_DXT1_mipmap.dds b/imageio/imageio-dds/src/test/resources/dds/dds_DXT1_mipmap.dds new file mode 100644 index 00000000..c83149e1 Binary files /dev/null and b/imageio/imageio-dds/src/test/resources/dds/dds_DXT1_mipmap.dds differ diff --git a/imageio/imageio-dds/src/test/resources/dds/dds_DXT2.dds b/imageio/imageio-dds/src/test/resources/dds/dds_DXT2.dds new file mode 100644 index 00000000..e6f6611f Binary files /dev/null and b/imageio/imageio-dds/src/test/resources/dds/dds_DXT2.dds differ diff --git a/imageio/imageio-dds/src/test/resources/dds/dds_DXT2_mipmap.dds b/imageio/imageio-dds/src/test/resources/dds/dds_DXT2_mipmap.dds new file mode 100644 index 00000000..58a26c44 Binary files /dev/null and b/imageio/imageio-dds/src/test/resources/dds/dds_DXT2_mipmap.dds differ diff --git a/imageio/imageio-dds/src/test/resources/dds/dds_DXT3.dds b/imageio/imageio-dds/src/test/resources/dds/dds_DXT3.dds new file mode 100644 index 00000000..f76135a0 Binary files /dev/null and b/imageio/imageio-dds/src/test/resources/dds/dds_DXT3.dds differ diff --git a/imageio/imageio-dds/src/test/resources/dds/dds_DXT3_mipmap.dds b/imageio/imageio-dds/src/test/resources/dds/dds_DXT3_mipmap.dds new file mode 100644 index 00000000..bb15d452 Binary files /dev/null and b/imageio/imageio-dds/src/test/resources/dds/dds_DXT3_mipmap.dds differ diff --git a/imageio/imageio-dds/src/test/resources/dds/dds_DXT4.dds b/imageio/imageio-dds/src/test/resources/dds/dds_DXT4.dds new file mode 100644 index 00000000..9fdf01ee Binary files /dev/null and b/imageio/imageio-dds/src/test/resources/dds/dds_DXT4.dds differ diff --git a/imageio/imageio-dds/src/test/resources/dds/dds_DXT4_mipmap.dds b/imageio/imageio-dds/src/test/resources/dds/dds_DXT4_mipmap.dds new file mode 100644 index 00000000..c2818848 Binary files /dev/null and b/imageio/imageio-dds/src/test/resources/dds/dds_DXT4_mipmap.dds differ diff --git a/imageio/imageio-dds/src/test/resources/dds/dds_DXT5.dds b/imageio/imageio-dds/src/test/resources/dds/dds_DXT5.dds new file mode 100644 index 00000000..89b34b8b Binary files /dev/null and b/imageio/imageio-dds/src/test/resources/dds/dds_DXT5.dds differ diff --git a/imageio/imageio-dds/src/test/resources/dds/dds_DXT5_mipmap.dds b/imageio/imageio-dds/src/test/resources/dds/dds_DXT5_mipmap.dds new file mode 100644 index 00000000..bb4bb50c Binary files /dev/null and b/imageio/imageio-dds/src/test/resources/dds/dds_DXT5_mipmap.dds differ diff --git a/imageio/imageio-dds/src/test/resources/dds/dds_R5G6B5.dds b/imageio/imageio-dds/src/test/resources/dds/dds_R5G6B5.dds new file mode 100644 index 00000000..ffb187f2 Binary files /dev/null and b/imageio/imageio-dds/src/test/resources/dds/dds_R5G6B5.dds differ diff --git a/imageio/imageio-dds/src/test/resources/dds/dds_R5G6B5_mipmap.dds b/imageio/imageio-dds/src/test/resources/dds/dds_R5G6B5_mipmap.dds new file mode 100644 index 00000000..1b37b0a6 Binary files /dev/null and b/imageio/imageio-dds/src/test/resources/dds/dds_R5G6B5_mipmap.dds differ diff --git a/imageio/imageio-dds/src/test/resources/dds/dds_R8G8B8.dds b/imageio/imageio-dds/src/test/resources/dds/dds_R8G8B8.dds new file mode 100644 index 00000000..f627c84f Binary files /dev/null and b/imageio/imageio-dds/src/test/resources/dds/dds_R8G8B8.dds differ diff --git a/imageio/imageio-dds/src/test/resources/dds/dds_R8G8B8_mipmap.dds b/imageio/imageio-dds/src/test/resources/dds/dds_R8G8B8_mipmap.dds new file mode 100644 index 00000000..6a3c1021 Binary files /dev/null and b/imageio/imageio-dds/src/test/resources/dds/dds_R8G8B8_mipmap.dds differ diff --git a/imageio/imageio-dds/src/test/resources/dds/dds_X1R5G5B5.dds b/imageio/imageio-dds/src/test/resources/dds/dds_X1R5G5B5.dds new file mode 100644 index 00000000..655e4205 Binary files /dev/null and b/imageio/imageio-dds/src/test/resources/dds/dds_X1R5G5B5.dds differ diff --git a/imageio/imageio-dds/src/test/resources/dds/dds_X1R5G5B5_mipmap.dds b/imageio/imageio-dds/src/test/resources/dds/dds_X1R5G5B5_mipmap.dds new file mode 100644 index 00000000..2092c836 Binary files /dev/null and b/imageio/imageio-dds/src/test/resources/dds/dds_X1R5G5B5_mipmap.dds differ diff --git a/imageio/imageio-dds/src/test/resources/dds/dds_X4R4G4B4.dds b/imageio/imageio-dds/src/test/resources/dds/dds_X4R4G4B4.dds new file mode 100644 index 00000000..8868a25c Binary files /dev/null and b/imageio/imageio-dds/src/test/resources/dds/dds_X4R4G4B4.dds differ diff --git a/imageio/imageio-dds/src/test/resources/dds/dds_X4R4G4B4_mipmap.dds b/imageio/imageio-dds/src/test/resources/dds/dds_X4R4G4B4_mipmap.dds new file mode 100644 index 00000000..350a96dc Binary files /dev/null and b/imageio/imageio-dds/src/test/resources/dds/dds_X4R4G4B4_mipmap.dds differ diff --git a/imageio/imageio-dds/src/test/resources/dds/dds_X8B8G8R8.dds b/imageio/imageio-dds/src/test/resources/dds/dds_X8B8G8R8.dds new file mode 100644 index 00000000..e186279c Binary files /dev/null and b/imageio/imageio-dds/src/test/resources/dds/dds_X8B8G8R8.dds differ diff --git a/imageio/imageio-dds/src/test/resources/dds/dds_X8B8G8R8_mipmap.dds b/imageio/imageio-dds/src/test/resources/dds/dds_X8B8G8R8_mipmap.dds new file mode 100644 index 00000000..d5d5fff9 Binary files /dev/null and b/imageio/imageio-dds/src/test/resources/dds/dds_X8B8G8R8_mipmap.dds differ diff --git a/imageio/imageio-dds/src/test/resources/dds/dds_X8R8G8B8.dds b/imageio/imageio-dds/src/test/resources/dds/dds_X8R8G8B8.dds new file mode 100644 index 00000000..8fc13152 Binary files /dev/null and b/imageio/imageio-dds/src/test/resources/dds/dds_X8R8G8B8.dds differ diff --git a/imageio/imageio-dds/src/test/resources/dds/dds_X8R8G8B8_mipmap.dds b/imageio/imageio-dds/src/test/resources/dds/dds_X8R8G8B8_mipmap.dds new file mode 100644 index 00000000..19913a7f Binary files /dev/null and b/imageio/imageio-dds/src/test/resources/dds/dds_X8R8G8B8_mipmap.dds differ