int GetDX10BitCount(DDS_Header.DXGI_FORMAT DX10Format) { int dx10Format = 32; switch (DX10Format) { // For now, 32 works. } return(dx10Format); }
/// <summary> /// Details the given format. /// </summary> /// <param name="dxgiFormat">Optional DX10 format. Default = Unknown.</param> /// <param name="inFormat">Image Format.</param> public DDSFormatDetails(DDSFormat inFormat, DDS_Header.DXGI_FORMAT dxgiFormat = new DDS_Header.DXGI_FORMAT()) { Format = inFormat; DX10Format = dxgiFormat; BitCount = 8; { switch (inFormat) { case DDSFormat.DDS_G8_L8: case DDSFormat.DDS_A8: case DDSFormat.DDS_ATI1: BitCount = 8; break; case DDSFormat.DDS_A8L8: case DDSFormat.DDS_V8U8: case DDSFormat.DDS_ATI2_3Dc: BitCount = 16; break; case DDSFormat.DDS_ABGR_8: case DDSFormat.DDS_ARGB_8: case DDSFormat.DDS_DXT1: case DDSFormat.DDS_DXT2: case DDSFormat.DDS_DXT3: case DDSFormat.DDS_DXT4: case DDSFormat.DDS_DXT5: case DDSFormat.DDS_G16_R16: BitCount = 32; break; case DDSFormat.DDS_RGB_8: BitCount = 24; break; case DDSFormat.DDS_ARGB_32F: DX10Format = DDS_Header.DXGI_FORMAT.DXGI_FORMAT_R32G32B32A32_FLOAT; BitCount = 128; break; case DDSFormat.DDS_R5G6B5: BitCount = 16; break; case DDSFormat.DDS_ARGB_4: case DDSFormat.DDS_CUSTOM: case DDSFormat.DDS_DX10: BitCount = GetDX10BitCount(DX10Format); break; } } // Functions ReadByte = ReadByteFromByte; ReadUShort = ReadUShortFromByte; ReadFloat = ReadFloatFromByte; SetMaxValue = WriteByteMax; WriteColor = WriteByte; ReadUShortAsArray = ReadUShortFromByteAsArray; ReadFloatAsArray = ReadFloatFromByteOrUShortAsArray; if (ComponentSize == 2) { ReadByte = ReadByteFromUShort; ReadUShort = ReadUShortFromUShort; ReadFloat = ReadFloatFromUShort; SetMaxValue = WriteUShortMax; WriteColor = WriteUShort; ReadUShortAsArray = ReadUShortFromUShortAsArray; // Don't need ReadFloatAsArray set here, as it's shared between byte and ushort reading. } else if (ComponentSize == 4) { ReadByte = ReadByteFromFloat; ReadUShort = ReadUShortFromFloat; ReadFloat = ReadFloatFromFloat; SetMaxValue = WriteFloatMax; WriteColor = WriteFloat; ReadUShortAsArray = ReadUShortFromFloatAsArray; ReadFloatAsArray = ReadFloatFromFloatAsArray; } switch (inFormat) { case DDSFormat.DDS_ATI1: BlockEncoder = DDS_Encoders.CompressBC4Block; break; case DDSFormat.DDS_ATI2_3Dc: BlockEncoder = DDS_Encoders.CompressBC5Block; break; case DDSFormat.DDS_DX10: if (DX10Format.ToString().Contains("BC7")) { BlockEncoder = DDS_Encoders.CompressBC7Block; } else { BlockEncoder = DDS_Encoders.CompressBC6Block; } break; case DDSFormat.DDS_DXT1: BlockEncoder = DDS_Encoders.CompressBC1Block; break; case DDSFormat.DDS_DXT2: case DDSFormat.DDS_DXT3: BlockEncoder = DDS_Encoders.CompressBC2Block; break; case DDSFormat.DDS_DXT4: case DDSFormat.DDS_DXT5: BlockEncoder = DDS_Encoders.CompressBC3Block; break; } switch (inFormat) { case DDSFormat.DDS_DXT1: BlockDecoder = DDS_Decoders.DecompressBC1Block; break; case DDSFormat.DDS_DXT2: case DDSFormat.DDS_DXT3: BlockDecoder = DDS_Decoders.DecompressBC2Block; break; case DDSFormat.DDS_DXT4: case DDSFormat.DDS_DXT5: BlockDecoder = DDS_Decoders.DecompressBC3Block; break; case DDSFormat.DDS_ATI1: BlockDecoder = DDS_Decoders.DecompressATI1Block; break; case DDSFormat.DDS_ATI2_3Dc: BlockDecoder = DDS_Decoders.DecompressATI2Block; break; case DDSFormat.DDS_DX10: if (DX10Format.ToString().Contains("BC7")) { BlockDecoder = DDS_Decoders.DecompressBC7Block; } else { BlockDecoder = DDS_Decoders.DecompressBC6Block; } break; } }