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)); }
/* 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)); }
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)); }
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)); }
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)); }
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); } }
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); }
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()}"); } }
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)); }
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 byte[] DecompressBlock(Byte[] data, int width, int height, DDS.DXGI_FORMAT format) { return(DirectXTex.ImageCompressor.Decompress(data, width, height, (int)format)); }