AmaroK86.ImageFormat.DDSImage.UncompressDXT1 C# (CSharp) Method

UncompressDXT1() private static method

private static UncompressDXT1 ( byte imgData, int w, int h ) : Bitmap
imgData byte
w int
h int
return System.Drawing.Bitmap
        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