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); }
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); }
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); }
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; }
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}"); } } }
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); }