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