private static Bitmap UncompressDXT1(byte[] imgData, int w, int h)
{
const int bufferSize = 8;
byte[] blockStorage = new byte[bufferSize];
MemoryStream bitmapStream = new MemoryStream(w * h * 2);
BinaryWriter bitmapBW = new BinaryWriter(bitmapStream);
int readPtr = 0;
for (int s = 0; s < h; s += 4)
{
for (int t = 0; t < w; t += 4)
{
Buffer.BlockCopy(imgData, readPtr, blockStorage, 0, bufferSize);
//DecompressBlockDXT1(i, j, buffer, res);
readPtr += bufferSize;
{
int color0 = blockStorage[0] | blockStorage[1] << 8;
int color1 = blockStorage[2] | blockStorage[3] << 8;
int temp;
temp = (color0 >> 11) * 255 + 16;
int r0 = ((temp >> 5) + temp) >> 5;
temp = ((color0 & 0x07E0) >> 5) * 255 + 32;
int g0 = ((temp >> 6) + temp) >> 6;
temp = (color0 & 0x001F) * 255 + 16;
int b0 = ((temp >> 5) + temp) >> 5;
temp = (color1 >> 11) * 255 + 16;
int r1 = ((temp >> 5) + temp) >> 5;
temp = ((color1 & 0x07E0) >> 5) * 255 + 32;
int g1 = ((temp >> 6) + temp) >> 6;
temp = (color1 & 0x001F) * 255 + 16;
int b1 = ((temp >> 5) + temp) >> 5;
int code = blockStorage[4] | blockStorage[5] << 8 | blockStorage[6] << 16 | blockStorage[7] << 24;
for (int j = 0; j < 4; j++)
{
bitmapStream.Seek(((s + j) * w * 4) + (t * 4), SeekOrigin.Begin);
for (int i = 0; i < 4; i++)
{
int fCol = 0;
int positionCode = ((code >> 2 * (4 * j + i)) & 0x03);
if (color0 > color1)
{
switch (positionCode)
{
case 0:
fCol = b0 | (g0 << 8) | (r0 << 16) | 0xFF << 24;
break;
case 1:
fCol = b1 | (g1 << 8) | (r1 << 16) | 0xFF << 24;
break;
case 2:
fCol = ((2 * b0 + b1) / 3) | (((2 * g0 + g1) / 3) << 8) | (((2 * r0 + r1) / 3) << 16) | (0xFF << 24);
break;
case 3:
fCol = ((b0 + 2 * b1) / 3) | ((g0 + 2 * g1) / 3) << 8 | ((r0 + 2 * r1) / 3) << 16 | 0xFF << 24;
break;
}
}
else
{
switch (positionCode)
{
case 0:
fCol = b0 | g0 << 8 | r0 << 16 | 0xFF << 24;
break;
case 1:
fCol = b1 | g1 << 8 | r1 << 16 | 0xFF << 24;
break;
case 2:
fCol = ((b0 + b1) / 2) | ((g0 + g1) / 2) << 8 | ((r0 + r1) / 2) << 16 | 0xFF << 24;
break;
case 3:
fCol = 0xFF << 24;
break;
}
}
bitmapBW.Write(fCol);
}
}
}
}
}
byte[] imageData = bitmapStream.ToArray();
var bmp = new Bitmap(w, h, PixelFormat.Format32bppArgb);
{
BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0,
bmp.Width,
bmp.Height),
ImageLockMode.WriteOnly,
bmp.PixelFormat);
//MessageBox.Show("empty bitmap stride: " + bmpData.Stride + "\n total bytes: " + bmpData.Stride * bmpData.Height + "\n imageData size : " + imageData.Length);
Marshal.Copy(imageData, 0, bmpData.Scan0, imageData.Length);
bmp.UnlockBits(bmpData);
}
return bmp;
}
#endregion