public static ImageEngineFormat DetermineDDSSurfaceFormat(DDS_Header.DDS_PIXELFORMAT ddspf)
{
ImageEngineFormat format = ParseFourCC(ddspf.dwFourCC);
if (format == ImageEngineFormat.Unknown)
{
// KFreon: Apparently all these flags mean it's a V8U8 image...
if (ddspf.dwRGBBitCount == 16 &&
ddspf.dwRBitMask == 0x00FF &&
ddspf.dwGBitMask == 0xFF00 &&
ddspf.dwBBitMask == 0x00 &&
ddspf.dwABitMask == 0x00 &&
(ddspf.dwFlags & DDS_PFdwFlags.DDPF_SIGNED) == DDS_PFdwFlags.DDPF_SIGNED)
format = ImageEngineFormat.DDS_V8U8;
// KFreon: Test for L8/G8
else if (ddspf.dwABitMask == 0 &&
ddspf.dwBBitMask == 0 &&
ddspf.dwGBitMask == 0 &&
ddspf.dwRBitMask == 0xFF &&
ddspf.dwFlags == DDS_PFdwFlags.DDPF_LUMINANCE &&
ddspf.dwRGBBitCount == 8)
format = ImageEngineFormat.DDS_G8_L8;
// KFreon: A8L8. This can probably be something else as well, but it seems to work for now
else if (ddspf.dwRGBBitCount == 16 &&
ddspf.dwFlags == (DDS_PFdwFlags.DDPF_ALPHAPIXELS | DDS_PFdwFlags.DDPF_LUMINANCE))
format = ImageEngineFormat.DDS_A8L8;
// KFreon: RGB. RGB channels have something in them, but alpha doesn't.
else if (((ddspf.dwFlags & DDS_PFdwFlags.DDPF_RGB) == DDS_PFdwFlags.DDPF_RGB && !((ddspf.dwFlags & DDS_PFdwFlags.DDPF_ALPHAPIXELS) == DDS_PFdwFlags.DDPF_ALPHAPIXELS)) ||
ddspf.dwABitMask == 0 &&
ddspf.dwBBitMask != 0 &&
ddspf.dwGBitMask != 0 &&
ddspf.dwRBitMask != 0)
format = ImageEngineFormat.DDS_RGB;
// KFreon: RGB and A channels are present.
else if (((ddspf.dwFlags & (DDS_PFdwFlags.DDPF_RGB | DDS_PFdwFlags.DDPF_ALPHAPIXELS)) == (DDS_PFdwFlags.DDPF_RGB | DDS_PFdwFlags.DDPF_ALPHAPIXELS)) ||
ddspf.dwABitMask != 0 &&
ddspf.dwBBitMask != 0 &&
ddspf.dwGBitMask != 0 &&
ddspf.dwRBitMask != 0)
format = ImageEngineFormat.DDS_ARGB;
// KFreon: If nothing else fits, but there's data in one of the bitmasks, assume it can be read.
else if (ddspf.dwABitMask != 0 || ddspf.dwRBitMask != 0 || ddspf.dwGBitMask != 0 || ddspf.dwBBitMask != 0)
format = ImageEngineFormat.DDS_CUSTOM;
else
throw new FormatException("DDS Format is unknown.");
}
return format;
}