public Dds(DdtFile ddt)
{
magic = 0x20534444;
header.size = 124;
header.flags |= DDS_HEADER.Flags.DDSD_CAPS | DDS_HEADER.Flags.DDSD_HEIGHT | DDS_HEADER.Flags.DDSD_WIDTH | DDS_HEADER.Flags.DDSD_PIXELFORMAT;
header.height = (uint)(ddt.Height);
header.width = (uint)(ddt.Width);
string texelFormat = ddt.GetTexelFormat();
switch (texelFormat)
{
case "DXT1"://dtx1
header.flags |= DDS_HEADER.Flags.DDSD_LINEARSIZE;
header.pitchOrLinearSize = (uint)(Math.Max(1, (ddt.Width + 3) / 4) * 8);
header.ddspf.flags |= DDS_PIXELFORMAT.Flags.DDPF_FOURCC;
header.ddspf.fourCC = BitConverter.ToUInt32(Encoding.UTF8.GetBytes(texelFormat), 0);
break;
case "DXT2":
case "DXT3":
case "DXT4":
case "DXT5":
header.flags |= DDS_HEADER.Flags.DDSD_LINEARSIZE;
header.pitchOrLinearSize = (uint)(Math.Max(1, (ddt.Width + 3) / 4) * 16);
header.ddspf.flags |= DDS_PIXELFORMAT.Flags.DDPF_FOURCC;
header.ddspf.fourCC = BitConverter.ToUInt32(Encoding.UTF8.GetBytes(texelFormat), 0);
break;
case "1555":
header.flags |= DDS_HEADER.Flags.DDSD_PITCH;
header.pitchOrLinearSize = (uint)((ddt.Width * 16 + 7) / 8);
header.ddspf.flags |= DDS_PIXELFORMAT.Flags.DDPF_RGB | DDS_PIXELFORMAT.Flags.DDPF_ALPHAPIXELS;
header.ddspf.rGBBitCount = 16;
header.ddspf.rBitMask = 0x7C00;
header.ddspf.gBitMask = 0x3E0;
header.ddspf.bBitMask = 0x1F;
header.ddspf.aBitMask = 0x8000;
break;
case "4444":
header.flags |= DDS_HEADER.Flags.DDSD_PITCH;
header.pitchOrLinearSize = (uint)((ddt.Width * 16 + 7) / 8);
header.ddspf.flags |= DDS_PIXELFORMAT.Flags.DDPF_RGB | DDS_PIXELFORMAT.Flags.DDPF_ALPHAPIXELS;
header.ddspf.rGBBitCount = 16;
header.ddspf.rBitMask = 0xF00;
header.ddspf.gBitMask = 0xF0;
header.ddspf.bBitMask = 0xF;
header.ddspf.aBitMask = 0xF000;
break;
}
if (ddt.mipMap > 1)
{
header.flags |= DDS_HEADER.Flags.DDSD_MIPMAPCOUNT;
header.mipMapCount = (uint)(ddt.mipMap + 1);
header.caps |= DDS_HEADER.Caps.DDSCAPS_MIPMAP | DDS_HEADER.Caps.DDSCAPS_COMPLEX;
}
header.reserved1 = new uint[11];
header.ddspf.size = 32;
header.caps |= DDS_HEADER.Caps.DDSCAPS_TEXTURE;
bdata = ddt.imageData;
}