private static unsafe Byte[] Compress(Byte[] data, int width, int height, TeximpNet.Compression.Compressor ddsCompressor)
        {
            var dataHandle = GCHandle.Alloc(data, GCHandleType.Pinned);

            try
            {
                var dataPtr = dataHandle.AddrOfPinnedObject();
                var mipData = new TeximpNet.DDS.MipData(width, height, width * 4, dataPtr, false);

                ddsCompressor.Input.SetMipmapData(mipData, true);
                ddsCompressor.Output.OutputHeader = false;

                if (ddsCompressor.Process(out var compressedImages))
                {
                    var outData = compressedImages.MipChains[0][0];

                    var outSpan = new Span <Byte>((Byte *)outData.Data, outData.SizeInBytes);

                    return(outSpan.ToArray());
                }

                throw new Exception(ddsCompressor.LastErrorString);
            }
            finally
            {
                dataHandle.Free();
            }
        }
        public static Byte[] CompressWithNvidia(this Bitmap srcImage, CompressionMode mode)
        {
            // System.Diagnostics.Debug.Assert(IntPtr.Size == 8, "nvtt.dll(x64) requires x64 runtime");

            srcImage = srcImage.Clone();
            srcImage.SwapElements(2, 1, 0, 3);

            using (var ddsCompressor = new TeximpNet.Compression.Compressor())
            {
                var inputOptions = ddsCompressor.Input;
                inputOptions.SetTextureLayout(TeximpNet.Compression.TextureType.Texture2D, srcImage.Width, srcImage.Height, 1);
                inputOptions.SetMipmapGeneration(false);
                inputOptions.SetGamma(1.0f, 1.0f);
                inputOptions.AlphaMode = (mode & CompressionMode.Dxt1) == 0
                    ? TeximpNet.Compression.AlphaMode.Premultiplied
                    : TeximpNet.Compression.AlphaMode.None;

                var compressionOptions = ddsCompressor.Compression;
                compressionOptions.Quality = TeximpNet.Compression.CompressionQuality.Normal;
                if ((mode & CompressionMode.Dxt1) != 0)
                {
                    compressionOptions.Format = TeximpNet.Compression.CompressionFormat.DXT1;
                }
                if ((mode & CompressionMode.Dxt3) != 0)
                {
                    compressionOptions.Format = TeximpNet.Compression.CompressionFormat.DXT3;
                }
                if ((mode & CompressionMode.Dxt5) != 0)
                {
                    compressionOptions.Format = TeximpNet.Compression.CompressionFormat.DXT5;
                }

                return(Compress(srcImage.Data, srcImage.Width, srcImage.Height, ddsCompressor));
            }
        }