Use Enum DDSType instead of int values.

Pass imageIndex into mipmap.
This commit is contained in:
Paul Allen
2024-09-19 19:03:33 +01:00
parent 7eb45b1245
commit dede5eabb5
3 changed files with 59 additions and 37 deletions
@@ -49,9 +49,6 @@ public final class DDSImageReader extends ImageReaderBase {
checkBounds(imageIndex);
readHeader();
// TODO change based on format DXT1 4bpp / DXT1-nonalpha
return ImageTypeSpecifiers.createFromBufferedImageType(BufferedImage.TYPE_INT_ARGB);
}
@@ -68,7 +65,7 @@ public final class DDSImageReader extends ImageReaderBase {
processImageStarted(imageIndex);
DDSReader dds = new DDSReader(header);
int[] pixels = dds.read(imageInput, 0);
int[] pixels = dds.read(imageInput, imageIndex);
int width = getWidth(imageIndex);
int height = getHeight(imageIndex);
@@ -41,7 +41,7 @@ public final class DDSReader {
}
// type
int type = getType();
DDSType type = getType();
// length
int len = getLength(type, width, height);
@@ -99,12 +99,13 @@ public final class DDSReader {
}
}
private int getType() throws IIOException {
private DDSType getType() throws IIOException {
int flags = header.getPixelFormatFlags();
if ((flags & 0x04) != 0) {
// DXT
return header.getFourCC();
int type = header.getFourCC();
return DDSType.parse(type);
} else if ((flags & 0x40) != 0) {
// RGB
int bitCount = header.getBitCount();
@@ -115,42 +116,42 @@ public final class DDSReader {
if (bitCount == 16) {
if (redMask == A1R5G5B5_MASKS[0] && greenMask == A1R5G5B5_MASKS[1] && blueMask == A1R5G5B5_MASKS[2] && alphaMask == A1R5G5B5_MASKS[3]) {
// A1R5G5B5
return A1R5G5B5;
return DDSType.A1R5G5B5;
} else if (redMask == X1R5G5B5_MASKS[0] && greenMask == X1R5G5B5_MASKS[1] && blueMask == X1R5G5B5_MASKS[2] && alphaMask == X1R5G5B5_MASKS[3]) {
// X1R5G5B5
return X1R5G5B5;
return DDSType.X1R5G5B5;
} else if (redMask == A4R4G4B4_MASKS[0] && greenMask == A4R4G4B4_MASKS[1] && blueMask == A4R4G4B4_MASKS[2] && alphaMask == A4R4G4B4_MASKS[3]) {
// A4R4G4B4
return A4R4G4B4;
return DDSType.A4R4G4B4;
} else if (redMask == X4R4G4B4_MASKS[0] && greenMask == X4R4G4B4_MASKS[1] && blueMask == X4R4G4B4_MASKS[2] && alphaMask == X4R4G4B4_MASKS[3]) {
// X4R4G4B4
return X4R4G4B4;
return DDSType.X4R4G4B4;
} else if (redMask == R5G6B5_MASKS[0] && greenMask == R5G6B5_MASKS[1] && blueMask == R5G6B5_MASKS[2] && alphaMask == R5G6B5_MASKS[3]) {
// R5G6B5
return R5G6B5;
return DDSType.R5G6B5;
} else {
throw new IIOException("Unsupported 16bit RGB image.");
}
} else if (bitCount == 24) {
if (redMask == R8G8B8_MASKS[0] && greenMask == R8G8B8_MASKS[1] && blueMask == R8G8B8_MASKS[2] && alphaMask == R8G8B8_MASKS[3]) {
// R8G8B8
return R8G8B8;
return DDSType.R8G8B8;
} else {
throw new IIOException("Unsupported 24bit RGB image.");
}
} else if (bitCount == 32) {
if (redMask == A8B8G8R8_MASKS[0] && greenMask == A8B8G8R8_MASKS[1] && blueMask == A8B8G8R8_MASKS[2] && alphaMask == A8B8G8R8_MASKS[3]) {
// A8B8G8R8
return A8B8G8R8;
return DDSType.A8B8G8R8;
} else if (redMask == X8B8G8R8_MASKS[0] && greenMask == X8B8G8R8_MASKS[1] && blueMask == X8B8G8R8_MASKS[2] && alphaMask == X8B8G8R8_MASKS[3]) {
// X8B8G8R8
return X8B8G8R8;
return DDSType.X8B8G8R8;
} else if (redMask == A8R8G8B8_MASKS[0] && greenMask == A8R8G8B8_MASKS[1] && blueMask == A8R8G8B8_MASKS[2] && alphaMask == A8R8G8B8_MASKS[3]) {
// A8R8G8B8
return A8R8G8B8;
return DDSType.A8R8G8B8;
} else if (redMask == X8R8G8B8_MASKS[0] && greenMask == X8R8G8B8_MASKS[1] && blueMask == X8R8G8B8_MASKS[2] && alphaMask == X8R8G8B8_MASKS[3]) {
// X8R8G8B8
return X8R8G8B8;
return DDSType.X8R8G8B8;
} else {
throw new IIOException("Unsupported 32bit RGB image.");
}
@@ -162,7 +163,7 @@ public final class DDSReader {
}
}
private static int getLength(int type, int width, int height) throws IIOException {
private static int getLength(DDSType type, int width, int height) throws IIOException {
switch (type) {
case DXT1:
return 8 * ((width + 3) / 4) * ((height + 3) / 4);
@@ -181,9 +182,9 @@ public final class DDSReader {
case X8B8G8R8:
case A8R8G8B8:
case X8R8G8B8:
return (type & 0xFF) * width * height;
return (type.value() & 0xFF) * width * height;
default:
throw new IIOException("Unknown type: " + Integer.toHexString(type));
throw new IIOException("Unknown type: " + Integer.toHexString(type.value()));
}
}
@@ -539,23 +540,6 @@ public final class DDSReader {
return 0;
}
// Image Type
private static final int DXT1 = (0x31545844);
private static final int DXT2 = (0x32545844);
private static final int DXT3 = (0x33545844);
private static final int DXT4 = (0x34545844);
private static final int DXT5 = (0x35545844);
private static final int A1R5G5B5 = ((1 << 16) | 2);
private static final int X1R5G5B5 = ((2 << 16) | 2);
private static final int A4R4G4B4 = ((3 << 16) | 2);
private static final int X4R4G4B4 = ((4 << 16) | 2);
private static final int R5G6B5 = ((5 << 16) | 2);
private static final int R8G8B8 = ((1 << 16) | 3);
private static final int A8B8G8R8 = ((1 << 16) | 4);
private static final int X8B8G8R8 = ((2 << 16) | 4);
private static final int A8R8G8B8 = ((3 << 16) | 4);
private static final int X8R8G8B8 = ((4 << 16) | 4);
// RGBA Masks
private static final int[] A1R5G5B5_MASKS = {0x7C00, 0x03E0, 0x001F, 0x8000};
private static final int[] X1R5G5B5_MASKS = {0x7C00, 0x03E0, 0x001F, 0x0000};
@@ -0,0 +1,41 @@
package com.twelvemonkeys.imageio.plugins.dds;
import javax.imageio.IIOException;
public enum DDSType {
DXT1(0x31545844),
DXT2(0x32545844),
DXT3(0x33545844),
DXT4(0x34545844),
DXT5(0x35545844),
A1R5G5B5((1 << 16) | 2),
X1R5G5B5((2 << 16) | 2),
A4R4G4B4((3 << 16) | 2),
X4R4G4B4((4 << 16) | 2),
R5G6B5((5 << 16) | 2),
R8G8B8((1 << 16) | 3),
A8B8G8R8((1 << 16) | 4),
X8B8G8R8((2 << 16) | 4),
A8R8G8B8((3 << 16) | 4),
X8R8G8B8((4 << 16) | 4);
private final int value;
DDSType(int value) {
this.value = value;
}
public int value() {
return value;
}
public static DDSType parse(int type) throws IIOException {
for (DDSType t : DDSType.values()) {
if (type == t.value()) {
return t;
}
}
throw new IIOException("Unknown type: " + Integer.toHexString(type));
}
}