internal static DdsFormat GetDdsFormat(DdsPixelFormat ddpf) { if ((ddpf.Options & DdsPixelFormatOptions.Rgb) != 0) { switch (ddpf.RgbBitCount) { case 32: if (IsBitMask(ddpf, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000)) { return(DdsFormat.R8G8B8A8UNorm); } if (IsBitMask(ddpf, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000)) { return(DdsFormat.B8G8R8A8UNorm); } if (IsBitMask(ddpf, 0x00ff0000, 0x0000ff00, 0x000000ff, 0x00000000)) { return(DdsFormat.B8G8R8X8UNorm); } if (IsBitMask(ddpf, 0x3ff00000, 0x000ffc00, 0x000003ff, 0xc0000000)) { return(DdsFormat.R10G10B10A2UNorm); } if (IsBitMask(ddpf, 0x0000ffff, 0xffff0000, 0x00000000, 0x00000000)) { return(DdsFormat.R16G16UNorm); } if (IsBitMask(ddpf, 0xffffffff, 0x00000000, 0x00000000, 0x00000000)) { return(DdsFormat.R32Float); } break; case 24: break; case 16: if (IsBitMask(ddpf, 0x7c00, 0x03e0, 0x001f, 0x8000)) { return(DdsFormat.B5G5R5A1UNorm); } if (IsBitMask(ddpf, 0xf800, 0x07e0, 0x001f, 0x0000)) { return(DdsFormat.B5G6R5UNorm); } if (IsBitMask(ddpf, 0x0f00, 0x00f0, 0x000f, 0xf000)) { return(DdsFormat.B4G4R4A4UNorm); } break; } } else if ((ddpf.Options & DdsPixelFormatOptions.Luminance) != 0) { switch (ddpf.RgbBitCount) { case 16: if (IsBitMask(ddpf, 0x0000ffff, 0x00000000, 0x00000000, 0x00000000)) { return(DdsFormat.R16UNorm); } if (IsBitMask(ddpf, 0x000000ff, 0x00000000, 0x00000000, 0x0000ff00)) { return(DdsFormat.R8G8UNorm); } break; case 8: if (IsBitMask(ddpf, 0x000000ff, 0x00000000, 0x00000000, 0x00000000)) { return(DdsFormat.R8UNorm); } if (IsBitMask(ddpf, 0x000000ff, 0x00000000, 0x00000000, 0x0000ff00)) { return(DdsFormat.R8G8UNorm); } break; } } else if ((ddpf.Options & DdsPixelFormatOptions.Alpha) != 0) { if (ddpf.RgbBitCount == 8) { return(DdsFormat.A8UNorm); } } else if ((ddpf.Options & DdsPixelFormatOptions.BumpDuDv) != 0) { switch (ddpf.RgbBitCount) { case 32: if (IsBitMask(ddpf, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000)) { return(DdsFormat.R8G8B8A8SNorm); } if (IsBitMask(ddpf, 0x0000ffff, 0xffff0000, 0x00000000, 0x00000000)) { return(DdsFormat.R16G16SNorm); } break; case 16: if (IsBitMask(ddpf, 0x00ff, 0xff00, 0x0000, 0x0000)) { return(DdsFormat.R8G8SNorm); } break; } } else if ((ddpf.Options & DdsPixelFormatOptions.FourCC) != 0) { switch (ddpf.FourCC) { case DdsFourCC.DXT1: return(DdsFormat.BC1UNorm); case DdsFourCC.DXT3: return(DdsFormat.BC2UNorm); case DdsFourCC.DXT5: return(DdsFormat.BC3UNorm); case DdsFourCC.DXT2: return(DdsFormat.BC2UNorm); case DdsFourCC.DXT4: return(DdsFormat.BC3UNorm); case DdsFourCC.BC4U: return(DdsFormat.BC4UNorm); case DdsFourCC.BC4S: return(DdsFormat.BC4SNorm); case DdsFourCC.BC5U: return(DdsFormat.BC5UNorm); case DdsFourCC.BC5S: return(DdsFormat.BC5SNorm); case DdsFourCC.RGBG: return(DdsFormat.R8G8B8G8UNorm); case DdsFourCC.GRGB: return(DdsFormat.G8R8G8B8UNorm); case DdsFourCC.YUY2: return(DdsFormat.Yuy2); case DdsFourCC.D3DFMT_A16B16G16R16: return(DdsFormat.R16G16B16A16UNorm); case DdsFourCC.D3DFMT_Q16W16V16U16: return(DdsFormat.R16G16B16A16SNorm); case DdsFourCC.D3DFMT_R16F: return(DdsFormat.R16Float); case DdsFourCC.D3DFMT_G16R16F: return(DdsFormat.R16G16Float); case DdsFourCC.D3DFMT_A16B16G16R16F: return(DdsFormat.R16G16B16A16Float); case DdsFourCC.D3DFMT_R32F: return(DdsFormat.R32Float); case DdsFourCC.D3DFMT_G32R32F: return(DdsFormat.R32G32Float); case DdsFourCC.D3DFMT_A32B32G32R32F: return(DdsFormat.R32G32B32A32Float); } } return(DdsFormat.Unknown); }
private static bool IsBitMask(DdsPixelFormat ddpf, uint r, uint g, uint b, uint a) { return(ddpf.RedBitMask == r && ddpf.GreenBitMask == g && ddpf.BlueBitMask == b && ddpf.AlphaBitMask == a); }