示例#1
0
        private void SetTextureFormat(int mipMapCount, BitmapFormat format, BitmapFlags flags)
        {
            if (mipMapCount > 0)
            {
                MipMapCount = mipMapCount;
                Flags      |= DDSFlags.MipMapCount;
            }
            else
            {
                MipMapCount = 0;
            }

            if (flags.HasFlag(BitmapFlags.Compressed))
            {
                Flags |= DDSFlags.LinearSize;
                int blockSize      = BitmapFormatUtils.GetBlockSize(format);
                int blockDimension = BitmapFormatUtils.GetBlockDimension(format);
                var nearestWidth   = blockDimension * ((Height + (blockDimension - 1)) / blockDimension);
                var nearestHeight  = blockDimension * ((Width + (blockDimension - 1)) / blockDimension);;
                PitchOrLinearSize = (nearestWidth * nearestHeight / 16) * blockSize;
            }
            else
            {
                Flags |= DDSFlags.Pitch;
                int bitsPerPixel = BitmapFormatUtils.GetBitsPerPixel(format);
                PitchOrLinearSize = (Width * bitsPerPixel + 7) / 8;
            }

            PixelFormat = new PixelFormat(format, flags);
        }
示例#2
0
 public void UpdateFormat(BitmapFormat format)
 {
     Format            = format;
     BlockSize         = BitmapFormatUtils.GetBlockSize(Format);
     BlockDimension    = BitmapFormatUtils.GetBlockDimension(Format);
     CompressionFactor = BitmapFormatUtils.GetCompressionFactor(Format);
     NearestHeight     = BlockDimension * ((Height + (BlockDimension - 1)) / BlockDimension);
     NearestWidth      = BlockDimension * ((Width + (BlockDimension - 1)) / BlockDimension);
 }
示例#3
0
 public new void UpdateFormat(BitmapFormat format)
 {
     Format            = format;
     BlockSize         = BitmapFormatUtils.GetBlockSize(Format);
     BlockDimension    = BitmapFormatUtils.GetBlockDimension(Format);
     CompressionFactor = BitmapFormatUtils.GetCompressionFactor(Format);
     MinimalBitmapSize = BitmapFormatUtils.GetMinimalVirtualSize(Format);
     VirtualWidth      = BitmapUtils.GetVirtualSize(Width, MinimalBitmapSize);
     VirtualHeight     = BitmapUtils.GetVirtualSize(Height, MinimalBitmapSize);
     TilePitch         = (int)(VirtualWidth * BlockDimension / CompressionFactor);
     Pitch             = (int)(NearestWidth * BlockDimension / CompressionFactor);
     NearestHeight     = BlockDimension * ((Height + (BlockDimension - 1)) / BlockDimension);
     NearestWidth      = BlockDimension * ((Width + (BlockDimension - 1)) / BlockDimension);
 }
示例#4
0
 public new void UpdateFormat(BitmapFormat format)
 {
     Format                   = format;
     BlockSize                = BitmapFormatUtils.GetBlockSize(Format);
     BlockDimension           = BitmapFormatUtils.GetBlockDimension(Format);
     CompressionFactor        = BitmapFormatUtils.GetCompressionFactor(Format);
     MinimalBitmapSize        = BitmapFormatUtils.GetMinimalVirtualSize(Format);
     VirtualWidth             = BitmapUtils.GetVirtualSize(Width, MinimalBitmapSize);
     VirtualHeight            = BitmapUtils.GetVirtualSize(Height, MinimalBitmapSize);
     NearestHeight            = BlockDimension * ((Height + (BlockDimension - 1)) / BlockDimension);
     NearestWidth             = BlockDimension * ((Width + (BlockDimension - 1)) / BlockDimension);
     TilePitch                = (int)(VirtualWidth * BlockDimension / CompressionFactor);
     Pitch                    = (int)(NearestWidth * BlockDimension / CompressionFactor);
     MultipleOfBlockDimension = Width % BlockDimension == 0 && Height % BlockDimension == 0;
     NotExact                 = Width != VirtualWidth || Height != VirtualHeight;
     InTile                   = Width <= MinimalBitmapSize / 2 && Height <= MinimalBitmapSize / 2;
 }
示例#5
0
        public void SetTextureFormat(BitmapFormat format, BitmapFlags flags)
        {
            if (flags.HasFlag(BitmapFlags.Compressed))
            {
                Flags |= DDSPixelFormatFlags.Compressed;
                switch (format)
                {
                case BitmapFormat.Dxt5:
                    Flags |= DDSPixelFormatFlags.FourCC;
                    FourCC = 0x35545844;
                    break;

                case BitmapFormat.Dxt3:
                    Flags |= DDSPixelFormatFlags.FourCC;
                    FourCC = 0x33545844;
                    break;

                case BitmapFormat.Dxt1:
                    Flags |= DDSPixelFormatFlags.FourCC;
                    FourCC = 0x31545844;
                    break;

                case BitmapFormat.Dxn:
                    Flags |= DDSPixelFormatFlags.FourCC;
                    FourCC = 0x32495441;
                    break;

                default:
                    throw new Exception($"Unsupported bitmap format {format}");
                }
            }
            else
            {
                Flags      |= DDSPixelFormatFlags.RGB;
                RGBBitCount = BitmapFormatUtils.GetBitsPerPixel(format);

                switch (format)
                {
                case BitmapFormat.A8:
                case BitmapFormat.AY8:
                    ABitMask = 0xFF;
                    Flags   |= DDSPixelFormatFlags.Alpha;
                    break;

                case BitmapFormat.Y8:
                    RBitMask = 0xFF;
                    Flags   |= DDSPixelFormatFlags.Luminance;
                    break;

                case BitmapFormat.A8Y8:
                    Flags   |= DDSPixelFormatFlags.RGB;
                    RBitMask = 0x00FF; ABitMask = 0xFF00;
                    break;

                case BitmapFormat.R5G6B5:
                    Flags   |= DDSPixelFormatFlags.RGB;
                    RBitMask = 0xF800; GBitMask = 0x07E0; BBitMask = 0x001F;
                    break;

                case BitmapFormat.A1R5G5B5:
                    Flags   |= DDSPixelFormatFlags.RGB;
                    RBitMask = 0x7C00; GBitMask = 0x03E0; BBitMask = 0x001F; ABitMask = 0x8000;
                    break;

                case BitmapFormat.A4R4G4B4:
                    Flags   |= DDSPixelFormatFlags.RGB;
                    RBitMask = 0xF000; GBitMask = 0x0F00; BBitMask = 0x00F0; ABitMask = 0x000F;
                    break;

                case BitmapFormat.A4R4G4B4Font:
                    Flags   |= DDSPixelFormatFlags.RGB;
                    RBitMask = 0xF000; GBitMask = 0x0F00; BBitMask = 0x00F0; ABitMask = 0x000F;
                    break;

                case BitmapFormat.A8R8G8B8:
                    Flags   |= DDSPixelFormatFlags.RGB;
                    RBitMask = 0x00FF0000; GBitMask = 0x0000FF00; BBitMask = 0x000000FF; ABitMask = 0xFF000000;
                    break;

                case BitmapFormat.X8R8G8B8:
                    Flags   |= DDSPixelFormatFlags.RGB;
                    RBitMask = 0x00FF0000; GBitMask = 0x0000FF00; BBitMask = 0x000000FF;
                    break;

                case BitmapFormat.V8U8:
                    RBitMask = 0xFF00; GBitMask = 0x00FF;
                    Flags   |= DDSPixelFormatFlags.BumpDUDV;
                    break;

                case BitmapFormat.A32B32G32R32F:
                    Flags |= DDSPixelFormatFlags.FourCC;
                    FourCC = 0x74;
                    break;

                case BitmapFormat.A16B16G16R16F:
                    Flags |= DDSPixelFormatFlags.FourCC;
                    FourCC = 0x71;
                    break;

                default:
                    throw new Exception($"Unsupported bitmap format {format}");
                }
            }
        }
示例#6
0
        private static bool ConvertImage(BaseBitmap bitmap)
        {
            BitmapFormat targetFormat = bitmap.Format;
            var          data         = bitmap.Data;
            bool         DXTFlip      = false;

            switch (bitmap.Format)
            {
            case BitmapFormat.Dxt5aMono:
            case BitmapFormat.Dxt3aMono:
                targetFormat  = BitmapFormat.Y8;
                bitmap.Flags &= ~BitmapFlags.Compressed;
                break;

            case BitmapFormat.Dxt3aAlpha:
            case BitmapFormat.Dxt5aAlpha:
                targetFormat  = BitmapFormat.A8;
                bitmap.Flags &= ~BitmapFlags.Compressed;
                break;

            case BitmapFormat.DxnMonoAlpha:
            case BitmapFormat.Dxt5a:
            case BitmapFormat.AY8:
                targetFormat  = BitmapFormat.A8Y8;;
                bitmap.Flags &= ~BitmapFlags.Compressed;
                break;

            case BitmapFormat.A4R4G4B4:
            case BitmapFormat.R5G6B5:
                targetFormat = BitmapFormat.A8R8G8B8;
                break;

            case BitmapFormat.A8Y8:
            case BitmapFormat.Y8:
            case BitmapFormat.A8:
            case BitmapFormat.A8R8G8B8:
            case BitmapFormat.X8R8G8B8:
            case BitmapFormat.A16B16G16R16F:
            case BitmapFormat.A32B32G32R32F:
            case BitmapFormat.V8U8:
                break;

            case BitmapFormat.Dxt1:
            case BitmapFormat.Dxt3:
            case BitmapFormat.Dxt5:
            case BitmapFormat.Dxn:
                if (bitmap.Height != bitmap.NearestHeight || bitmap.Width != bitmap.NearestWidth)
                {
                    targetFormat  = BitmapFormat.A8R8G8B8;
                    bitmap.Flags &= ~BitmapFlags.Compressed;
                    DXTFlip       = true;
                }
                break;

            case BitmapFormat.Ctx1:
                bitmap.UpdateFormat(BitmapFormat.Dxn);
                data         = BitmapDecoder.Ctx1ToDxn(data, bitmap.NearestWidth, bitmap.NearestHeight);
                targetFormat = BitmapFormat.Dxn;
                break;

            default:
                throw new Exception($"Unsupported bitmap format {bitmap.Format}");
            }

            if (targetFormat != bitmap.Format)
            {
                data = BitmapDecoder.DecodeBitmap(data, bitmap.Format, bitmap.NearestWidth, bitmap.NearestHeight);
                data = BitmapDecoder.EncodeBitmap(data, targetFormat, bitmap.NearestWidth, bitmap.NearestHeight);

                bool reformat = false;

                if (bitmap.NearestHeight != bitmap.Height || bitmap.NearestWidth != bitmap.Width)
                {
                    reformat = true;
                }

                if (reformat)
                {
                    var compressionFactor = BitmapFormatUtils.GetCompressionFactor(targetFormat);
                    int fixedSize         = (int)(bitmap.Width * bitmap.Height / compressionFactor);
                    int tilePitch         = (int)(bitmap.NearestWidth / compressionFactor);
                    int pitch             = (int)(bitmap.Width / compressionFactor);

                    byte[] fixedData    = new byte[fixedSize];
                    int    numberOfPass = bitmap.Height;   // encode does not give back block compressed data.
                    for (int i = 0; i < numberOfPass; i++) // may need to compute an offset for special bitmaps
                    {
                        Array.Copy(data, i * tilePitch, fixedData, i * pitch, pitch);
                    }
                    data = fixedData;
                }

                bitmap.UpdateFormat(targetFormat);
                bitmap.Data = data;
            }

            bitmap.Data = data;

            if (DXTFlip)
            {
                return(false);
            }

            return(true);
        }