예제 #1
0
        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);
        }
예제 #2
0
 public static ICompressedImage Compress(IUncompressedImage bitmap, IBlockCompressionFormat format)
 {
     using (Profiler.MeasureTime())
     {
         return(new BlockCompressor().Compress(bitmap, format));
     }
 }