Пример #1
0
        public static byte[] DecodePixelBlock(Byte[] data, int width, int height, DDS.DXGI_FORMAT format)
        {
            if (format == DDS.DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM || format == DDS.DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM_SRGB)
            {
                return(data);
            }

            return(DirectXTex.ImageConverter.Convert(data, width, height, (int)format, (int)DDS.DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM));
        }
Пример #2
0
        /*    public static byte[] CompressBlock(Byte[] data, int width, int height, DDS.DXGI_FORMAT format, float AlphaRef)
         *  {
         *      return DirectXTex.ImageCompressor.Compress(data, width, height, (int)format, AlphaRef);
         *  }*/

        public static Bitmap DecompressBlock(Byte[] data, int width, int height, DDS.DXGI_FORMAT format, bool GetBitmap)
        {
            byte[] output = null;

            switch (format)
            {
            case DDS.DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM:
            case DDS.DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM_SRGB:
                output = CSharpImageLibrary.DDS.Dxt.DecompressDxt1(data, (int)width, (int)height);
                break;

            case DDS.DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM:
            case DDS.DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM_SRGB:
                output = CSharpImageLibrary.DDS.Dxt.DecompressDxt5(data, (int)width, (int)height);
                break;

            case DDS.DXGI_FORMAT.DXGI_FORMAT_BC4_UNORM:
            case DDS.DXGI_FORMAT.DXGI_FORMAT_BC4_SNORM:
                output = CSharpImageLibrary.DDS.Dxt.DecompressDxt4(data, (int)width, (int)height);
                break;

            case DDS.DXGI_FORMAT.DXGI_FORMAT_BC5_UNORM:
            case DDS.DXGI_FORMAT.DXGI_FORMAT_BC5_SNORM:
                output = CSharpImageLibrary.DDS.Dxt.DecompressDxt4(data, (int)width, (int)height);
                break;

            case DDS.DXGI_FORMAT.DXGI_FORMAT_BC7_UNORM:
            case DDS.DXGI_FORMAT.DXGI_FORMAT_BC7_UNORM_SRGB:
                output = CSharpImageLibrary.DDS.Dxt.DecompressBc7(data, (int)width, (int)height);
                break;

            default:
                output = DecompressBlock(data, width, height, format);
                break;
            }

            return(BitmapExtension.GetBitmap(output, (int)width, (int)height));
        }
Пример #3
0
 public static Bitmap DecompressCompLibBlock(Byte[] data, int width, int height, DDS.DXGI_FORMAT format, bool GetBitmap)
 {
     return(BitmapExtension.GetBitmap(DecompressBlock(data, width, height, format), (int)width, (int)height));
 }
Пример #4
0
        public static unsafe byte[] EncodePixelBlock(Byte[] data, int width, int height, DDS.DXGI_FORMAT format, float AlphaRef = 0.5f)
        {
            if (format == DDS.DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM || format == DDS.DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM_SRGB)
            {
                return(data);
            }

            return(Convert(data, width, height, DXGI_FORMAT.R8G8B8A8_UNORM, (DXGI_FORMAT)format));
        }
Пример #5
0
        public static unsafe byte[] DecodePixelBlock(Byte[] data, int width, int height, DDS.DXGI_FORMAT format, float AlphaRef = 0.5f)
        {
            if (format == DDS.DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM)
            {
                byte[] result = new byte[data.Length];
                Array.Copy(data, result, data.Length);
                return(result);
            }

            return(Convert(data, width, height, (DXGI_FORMAT)format, DXGI_FORMAT.R8G8B8A8_UNORM));
        }
Пример #6
0
        public static unsafe byte[] DecompressBlock(Byte[] data, int width, int height, DDS.DXGI_FORMAT format)
        {
            Console.WriteLine(format);
            Console.WriteLine(width);
            Console.WriteLine(height);

            long inputRowPitch;
            long inputSlicePitch;

            TexHelper.Instance.ComputePitch((DXGI_FORMAT)format, width, height, out inputRowPitch, out inputSlicePitch, CP_FLAGS.NONE);

            DXGI_FORMAT FormatDecompressed;

            if (format.ToString().Contains("SRGB"))
            {
                FormatDecompressed = DXGI_FORMAT.R8G8B8A8_UNORM_SRGB;
            }
            else
            {
                FormatDecompressed = DXGI_FORMAT.R8G8B8A8_UNORM;
            }

            byte *buf;

            buf = (byte *)Marshal.AllocHGlobal((int)inputSlicePitch);
            Marshal.Copy(data, 0, (IntPtr)buf, (int)inputSlicePitch);

            DirectXTexNet.Image inputImage = new DirectXTexNet.Image(
                width, height, (DXGI_FORMAT)format, inputRowPitch,
                inputSlicePitch, (IntPtr)buf, null);

            TexMetadata texMetadata = new TexMetadata(width, height, 1, 1, 1, 0, 0,
                                                      (DXGI_FORMAT)format, TEX_DIMENSION.TEXTURE2D);

            ScratchImage scratchImage = TexHelper.Instance.InitializeTemporary(
                new DirectXTexNet.Image[] { inputImage }, texMetadata, null);

            using (var decomp = scratchImage.Decompress(0, FormatDecompressed))
            {
                byte[] result = new byte[4 * width * height];
                Marshal.Copy(decomp.GetImage(0).Pixels, result, 0, result.Length);

                inputImage = null;
                scratchImage.Dispose();

                return(result);
            }
        }
Пример #7
0
        public static unsafe byte[] CompressBlock(Byte[] data, int width, int height, DDS.DXGI_FORMAT format, bool multiThread, float AlphaRef = 0.5f, STCompressionMode CompressionMode = STCompressionMode.Normal)
        {
            long inputRowPitch   = width * 4;
            long inputSlicePitch = width * height * 4;

            if (data.Length == inputSlicePitch)
            {
                byte *buf;
                buf = (byte *)Marshal.AllocHGlobal((int)inputSlicePitch);
                Marshal.Copy(data, 0, (IntPtr)buf, (int)inputSlicePitch);

                DirectXTexNet.Image inputImage = new DirectXTexNet.Image(
                    width, height, DXGI_FORMAT.R8G8B8A8_UNORM, inputRowPitch,
                    inputSlicePitch, (IntPtr)buf, null);

                TexMetadata texMetadata = new TexMetadata(width, height, 1, 1, 1, 0, 0,
                                                          DXGI_FORMAT.R8G8B8A8_UNORM, TEX_DIMENSION.TEXTURE2D);

                ScratchImage scratchImage = TexHelper.Instance.InitializeTemporary(
                    new DirectXTexNet.Image[] { inputImage }, texMetadata, null);

                var compFlags = TEX_COMPRESS_FLAGS.DEFAULT;

                if (multiThread)
                {
                    compFlags |= TEX_COMPRESS_FLAGS.PARALLEL;
                }

                if (format == DDS.DXGI_FORMAT.DXGI_FORMAT_BC7_UNORM ||
                    format == DDS.DXGI_FORMAT.DXGI_FORMAT_BC7_UNORM_SRGB ||
                    format == DDS.DXGI_FORMAT.DXGI_FORMAT_BC7_TYPELESS)
                {
                    if (CompressionMode == STCompressionMode.Fast)
                    {
                        compFlags |= TEX_COMPRESS_FLAGS.BC7_QUICK;
                    }
                }

                if (format == DDS.DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM_SRGB ||
                    format == DDS.DXGI_FORMAT.DXGI_FORMAT_BC1_UNORM_SRGB ||
                    format == DDS.DXGI_FORMAT.DXGI_FORMAT_BC2_UNORM_SRGB ||
                    format == DDS.DXGI_FORMAT.DXGI_FORMAT_BC3_UNORM_SRGB ||
                    format == DDS.DXGI_FORMAT.DXGI_FORMAT_BC7_UNORM_SRGB)
                {
                    compFlags |= TEX_COMPRESS_FLAGS.SRGB;
                }

                using (var comp = scratchImage.Compress((DXGI_FORMAT)format, compFlags, 0.5f))
                {
                    long outRowPitch;
                    long outSlicePitch;
                    TexHelper.Instance.ComputePitch((DXGI_FORMAT)format, width, height, out outRowPitch, out outSlicePitch, CP_FLAGS.NONE);

                    byte[] result = new byte[outSlicePitch];
                    Marshal.Copy(comp.GetImage(0).Pixels, result, 0, result.Length);

                    inputImage = null;
                    scratchImage.Dispose();


                    return(result);
                }
            }
            return(null);
        }
Пример #8
0
        private static PixelFormat GetPixelFormatFromDXGI(DDS.DXGI_FORMAT fmt)
        {
            switch (fmt)
            {
            case DDS.DXGI_FORMAT.B5G5R5A1_UNORM:
                return(PixelFormat.B5_G5_R5_A1_UNorm);

            case DDS.DXGI_FORMAT.B8G8R8A8_TYPELESS:
            case DDS.DXGI_FORMAT.B8G8R8A8_UNORM:
            case DDS.DXGI_FORMAT.B8G8R8X8_TYPELESS:
            case DDS.DXGI_FORMAT.B8G8R8X8_UNORM:
                return(PixelFormat.B8_G8_R8_A8_UNorm);

            case DDS.DXGI_FORMAT.B8G8R8A8_UNORM_SRGB:
            case DDS.DXGI_FORMAT.B8G8R8X8_UNORM_SRGB:
                return(PixelFormat.B8_G8_R8_A8_UNorm_SRgb);

            case DDS.DXGI_FORMAT.R8G8B8A8_UNORM_SRGB:
                return(PixelFormat.R8_G8_B8_A8_UNorm_SRgb);

            case DDS.DXGI_FORMAT.R8G8B8A8_UNORM:
            case DDS.DXGI_FORMAT.R8G8B8A8_TYPELESS:
                return(PixelFormat.R8_G8_B8_A8_UNorm);

            case DDS.DXGI_FORMAT.BC1_TYPELESS:
            case DDS.DXGI_FORMAT.BC1_UNORM:
                return(PixelFormat.BC1_Rgba_UNorm);

            case DDS.DXGI_FORMAT.BC1_UNORM_SRGB:
                return(PixelFormat.BC1_Rgba_UNorm_SRgb);

            case DDS.DXGI_FORMAT.BC2_TYPELESS:
            case DDS.DXGI_FORMAT.BC2_UNORM:
                return(PixelFormat.BC2_UNorm);

            case DDS.DXGI_FORMAT.BC2_UNORM_SRGB:
                return(PixelFormat.BC2_UNorm_SRgb);

            case DDS.DXGI_FORMAT.BC3_TYPELESS:
            case DDS.DXGI_FORMAT.BC3_UNORM:
                return(PixelFormat.BC3_UNorm);

            case DDS.DXGI_FORMAT.BC3_UNORM_SRGB:
                return(PixelFormat.BC3_UNorm_SRgb);

            case DDS.DXGI_FORMAT.BC4_TYPELESS:
            case DDS.DXGI_FORMAT.BC4_UNORM:
                return(PixelFormat.BC4_UNorm);

            case DDS.DXGI_FORMAT.BC4_SNORM:
                return(PixelFormat.BC4_SNorm);

            case DDS.DXGI_FORMAT.BC5_TYPELESS:
            case DDS.DXGI_FORMAT.BC5_UNORM:
                return(PixelFormat.BC5_UNorm);

            case DDS.DXGI_FORMAT.BC5_SNORM:
                return(PixelFormat.BC5_SNorm);

            case DDS.DXGI_FORMAT.BC6H_TYPELESS:
            case DDS.DXGI_FORMAT.BC6H_UF16:
                return(PixelFormat.BC6H_UFloat);

            case DDS.DXGI_FORMAT.BC6H_SF16:
                return(PixelFormat.BC6H_SFloat);

            case DDS.DXGI_FORMAT.BC7_TYPELESS:
            case DDS.DXGI_FORMAT.BC7_UNORM:
                return(PixelFormat.BC7_UNorm);

            case DDS.DXGI_FORMAT.BC7_UNORM_SRGB:
                return(PixelFormat.BC7_UNorm_SRgb);

            default:
                throw new Exception($"Unimplemented DXGI Type: {fmt.ToString()}");
            }
        }
Пример #9
0
 public static Bitmap DecompressBlock(Byte[] data, int width, int height, DDS.DXGI_FORMAT format, bool GetBitmap)
 {
     return(BitmapExtension.GetBitmap(DirectXTex.ImageCompressor.Decompress(data, width, height, (int)format), width, height));
 }
Пример #10
0
 public static byte[] CompressBlock(Byte[] data, int width, int height, DDS.DXGI_FORMAT format, float alphaRef)
 {
     return(DirectXTex.ImageCompressor.Compress(data, width, height, (int)format, alphaRef));
 }
Пример #11
0
 public static byte[] DecompressBlock(Byte[] data, int width, int height, DDS.DXGI_FORMAT format)
 {
     return(DirectXTex.ImageCompressor.Decompress(data, width, height, (int)format));
 }