public ICompressedImage Compress(IUncompressedImage image, IBlockCompressionFormat format) { if (!AreDimensionsMultipleOfFour(image)) { throw new InvalidOperationException("Only textures with dimensions that are multiples of " + $"{BlockFormat.Dimension} can be block compressed."); } Logger.Default.Log("Compressing BMP to DDS."); var dds = DDSImage.CreateEmpty(image.Width, image.Height, format); int numberOfVerticalBlocks = image.Height / BlockFormat.Dimension; int numberOfHorizontalBlocks = image.Width / BlockFormat.Dimension; int numberOfBlocks = numberOfVerticalBlocks * numberOfHorizontalBlocks; Parallel.For(0, numberOfBlocks, #if DEBUG RunInSingleThread, #endif (i) => { var blockIndex = PointUtility.FromRowMajor(i, numberOfHorizontalBlocks); var blockColors = image.GetBlockColors(blockIndex); var blockData = format.Compress(blockColors); dds.SetBlockData(blockIndex, blockData); }); Logger.Default.Log("Compression successful."); return(dds); }
public static ICompressedImage Compress(IUncompressedImage bitmap, IBlockCompressionFormat format) { using (Profiler.MeasureTime()) { return(new BlockCompressor().Compress(bitmap, format)); } }