Exemple #1
0
        public static TexFormat GetUncompressedType(DDS dds, byte[] Components, bool IsRGB, bool HasAlpha, bool HasLuminance, DDS.DDSPFHeader header)
        {
            uint bpp       = header.RgbBitCount;
            uint RedMask   = header.RBitMask;
            uint GreenMask = header.GBitMask;
            uint BlueMask  = header.BBitMask;
            uint AlphaMask = HasAlpha ? header.ABitMask : 0;

            if (HasLuminance)
            {
                throw new Exception("Luminance not supported!");
            }
            else if (IsRGB)
            {
                if (bpp == 16)
                {
                    if (RedMask == A1R5G5B5_MASKS[0] && GreenMask == A1R5G5B5_MASKS[1] && BlueMask == A1R5G5B5_MASKS[2] && AlphaMask == A1R5G5B5_MASKS[3])
                    {
                        return(TexFormat.BGR5A1_UNORM);
                    }
                    else if (RedMask == X1R5G5B5_MASKS[0] && GreenMask == X1R5G5B5_MASKS[1] && BlueMask == X1R5G5B5_MASKS[2] && AlphaMask == X1R5G5B5_MASKS[3])
                    {
                        return(TexFormat.RGB565_UNORM);
                    }
                    else if (RedMask == A4R4G4B4_MASKS[0] && GreenMask == A4R4G4B4_MASKS[1] && BlueMask == A4R4G4B4_MASKS[2] && AlphaMask == A4R4G4B4_MASKS[3])
                    {
                        return(TexFormat.RGBA4_UNORM);
                    }
                    else if (RedMask == X4R4G4B4_MASKS[0] && GreenMask == X4R4G4B4_MASKS[1] && BlueMask == X4R4G4B4_MASKS[2] && AlphaMask == X4R4G4B4_MASKS[3])
                    {
                        return(TexFormat.RGBA4_UNORM);
                    }
                    else if (RedMask == R5G6B5_MASKS[0] && GreenMask == R5G6B5_MASKS[1] && BlueMask == R5G6B5_MASKS[2] && AlphaMask == R5G6B5_MASKS[3])
                    {
                        return(TexFormat.RGB565_UNORM);
                    }
                    else
                    {
                        throw new Exception("Unsupported 16 bit image!");
                    }
                }
                else if (bpp == 24)
                {
                    if (RedMask == R8G8B8_MASKS[0] && GreenMask == R8G8B8_MASKS[1] && BlueMask == R8G8B8_MASKS[2] && AlphaMask == R8G8B8_MASKS[3])
                    {
                        //  dds.bdata = ConvertToRgba(this, "RGB8", 3, new byte[4] { 2, 1, 0, 3 });
                        return(TexFormat.RGB8_UNORM);
                    }
                    else
                    {
                        throw new Exception("Unsupported 24 bit image!");
                    }
                }
                else if (bpp == 32)
                {
                    if (RedMask == A8B8G8R8_MASKS[0] && GreenMask == A8B8G8R8_MASKS[1] && BlueMask == A8B8G8R8_MASKS[2] && AlphaMask == A8B8G8R8_MASKS[3])
                    {
                        return(TexFormat.RGBA8_UNORM);
                    }
                    else if (RedMask == X8B8G8R8_MASKS[0] && GreenMask == X8B8G8R8_MASKS[1] && BlueMask == X8B8G8R8_MASKS[2] && AlphaMask == X8B8G8R8_MASKS[3])
                    {
                        //dds.bdata = ConvertToRgba(this, "RGB8X", 4, new byte[4] { 2, 1, 0, 3 });
                        return(TexFormat.BGRX8_UNORM);
                    }
                    else if (RedMask == A8R8G8B8_MASKS[0] && GreenMask == A8R8G8B8_MASKS[1] && BlueMask == A8R8G8B8_MASKS[2] && AlphaMask == A8R8G8B8_MASKS[3])
                    {
                        //dds.bdata = ConvertBgraToRgba(dds.bdata);
                        return(TexFormat.RGBA8_UNORM);
                    }
                    else if (RedMask == X8R8G8B8_MASKS[0] && GreenMask == X8R8G8B8_MASKS[1] && BlueMask == X8R8G8B8_MASKS[2] && AlphaMask == X8R8G8B8_MASKS[3])
                    {
                        //   dds.bdata = ConvertToRgba(this, "RGB8X", 4, new byte[4] { 0, 1, 2, 3 });
                        return(TexFormat.BGRX8_UNORM);
                    }
                    else
                    {
                        throw new Exception("Unsupported 32 bit image!");
                    }
                }
            }
            else
            {
                throw new Exception("Unknown type!");
            }
            return(TexFormat.UNKNOWN);
        }
        public static TexFormat GetUncompressedType(DDS dds, byte[] Components, bool IsRGB, bool HasAlpha, bool HasLuminance, DDS.DDSPFHeader header)
        {
            uint bpp       = header.RgbBitCount;
            uint RedMask   = header.RBitMask;
            uint GreenMask = header.GBitMask;
            uint BlueMask  = header.BBitMask;
            uint AlphaMask = HasAlpha ? header.ABitMask : 0;

            uint[] maskRGBA = new uint[4] {
                RedMask, GreenMask, BlueMask, AlphaMask
            };

            if (HasLuminance)
            {
                throw new Exception("Luminance not supported!");
            }
            else if (IsRGB)
            {
                if (bpp == 16)
                {
                    if (IsMatch(maskRGBA, A1R5G5B5_MASKS))
                    {
                        return(TexFormat.BGR5A1_UNORM);
                    }
                    else if (IsMatch(maskRGBA, X1R5G5B5_MASKS))
                    {
                        return(TexFormat.RGB565_UNORM);
                    }
                    else if (IsMatch(maskRGBA, A4R4G4B4_MASKS))
                    {
                        return(TexFormat.RGBA4_UNORM);
                    }
                    else if (IsMatch(maskRGBA, X4R4G4B4_MASKS))
                    {
                        return(TexFormat.RGBA4_UNORM);
                    }
                    else if (IsMatch(maskRGBA, R5G6B5_MASKS))
                    {
                        return(TexFormat.RGB565_UNORM);
                    }
                    else
                    {
                        throw new Exception("Unsupported 16 bit image!");
                    }
                }
                else if (bpp == 24)
                {
                    if (IsMatch(maskRGBA, R8G8B8_MASKS))
                    {
                        return(TexFormat.RGB8_UNORM);
                    }
                    else
                    {
                        throw new Exception("Unsupported 24 bit image!");
                    }
                }
                else if (bpp == 32)
                {
                    if (IsMatch(maskRGBA, A8B8G8R8_MASKS))
                    {
                        return(TexFormat.RGBA8_UNORM);
                    }
                    else if (IsMatch(maskRGBA, X8B8G8R8_MASKS))
                    {
                        return(TexFormat.BGRX8_UNORM);
                    }
                    else if (IsMatch(maskRGBA, A8R8G8B8_MASKS))
                    {
                        return(TexFormat.BGRA8_UNORM);
                    }
                    else if (IsMatch(maskRGBA, X8R8G8B8_MASKS))
                    {
                        return(TexFormat.BGRX8_UNORM);
                    }
                    else
                    {
                        throw new Exception("Unsupported 32 bit image!");
                    }
                }
            }
            else
            {
                throw new Exception("Unknown type!");
            }
            return(TexFormat.UNKNOWN);
        }