public Image GetImage() { var bitmap = new Bitmap(Size.Width, Size.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); if (PixelFormat == ImgPixelFormat.Bgra32) { var bitmapData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat); Marshal.Copy(Data, 0, bitmapData.Scan0, bitmapData.Stride * bitmap.Height); bitmap.UnlockBits(bitmapData); var stream = new MemoryStream(); bitmap.Save(stream, ImageFormat.Bmp); return(Image.FromStream(stream)); } if (PixelFormat != ImgPixelFormat.Dxt1 && PixelFormat != ImgPixelFormat.Dxt3) { if (PixelFormat != ImgPixelFormat.Dxt5) { throw new Exception("Can't decode DDS, Unknown format: " + PixelFormat); } } var unk = new ImageRelatedClass(bitmap); unk.method_4(); var binaryReader = new BinaryReader(new MemoryStream(Data)); ZzTextureClass.smethod_17(binaryReader, unk, PixelFormat); binaryReader.Close(); unk.method_5(true); var stream2 = new MemoryStream(); bitmap.Save(stream2, ImageFormat.Bmp); return(Image.FromStream(stream2)); }
public static void smethod_17(BinaryReader binaryReader0, ImageRelatedClass class2190, ImgPixelFormat imgpixelFormat0) { var array = new Tom[16]; var num = class2190.method_1(); var num2 = class2190.method_0(); for (var i = 0; i < num; i += 4) { for (var j = 0; j < num2; j += 4) { if (imgpixelFormat0 == ImgPixelFormat.Dxt3) { var array2 = new ushort[4]; for (var k = 0; k < 4; k++) { for (var l = 0; l < 4; l++) { if (l == 0) { array2[k] = binaryReader0.ReadUInt16(); } array[k * 4 + l].Float0 = (array2[k] & 15) / 15f; var expr74Cp0 = array2; var expr74Cp1 = k; expr74Cp0[expr74Cp1] = (ushort)(expr74Cp0[expr74Cp1] >> 4); } } } else if (imgpixelFormat0 == ImgPixelFormat.Dxt5) { var array3 = binaryReader0.ReadBytes(2); var array4 = binaryReader0.ReadBytes(6); var array5 = new float[8]; array5[0] = array3[0] / 255f; array5[1] = array3[1] / 255f; var num3 = 4; if (array3[0] > array3[1]) { num3 = 6; } else { array5[6] = 0f; array5[7] = 1f; } var num4 = 1f / (num3 + 1); for (var m = 0; m < num3; m++) { var num5 = (num3 - m) * num4; var num6 = (m + 1) * num4; array5[m + 2] = num5 * array3[0] + num6 * array3[1]; } for (var n = 0; n < 16; n++) { //Console.WriteLine("Broken"); var div = (n * 3) / 8; var rem = (n * 3) % 8; var b = (byte)((array4[div] >> rem) & 7); if (rem > 5) { var b2 = (byte)((array4[div + 1] << (8 - rem)) & 0xFF); b |= (byte)(b2 & 7); } array[n].Float0 = array5[b]; } } var @struct = Jerry.smethod_0(binaryReader0); var array6 = new Tom[4]; array6[0].Float1 = ((@struct.Ushort0 & 63488) >> 11) / 31f; array6[0].Float2 = ((@struct.Ushort0 & 2016) >> 5) / 63f; array6[0].Float3 = (@struct.Ushort0 & 31) / 31f; array6[1].Float1 = ((@struct.Ushort1 & 63488) >> 11) / 31f; array6[1].Float2 = ((@struct.Ushort1 & 2016) >> 5) / 63f; array6[1].Float3 = (@struct.Ushort1 & 31) / 31f; if (imgpixelFormat0 == ImgPixelFormat.Dxt1 && @struct.Ushort0 <= @struct.Ushort1) { array6[2] = Tom.smethod_1(Tom.smethod_2(array6[0], array6[1]), 0.5f); array6[3] = default(Tom); } else { array6[2] = Tom.smethod_1(Tom.smethod_2(Tom.smethod_0(2f, array6[0]), array6[1]), 0.333333343f); array6[3] = Tom.smethod_1(Tom.smethod_2(array6[0], Tom.smethod_0(2f, array6[1])), 0.333333343f); } for (var num9 = 0; num9 < 4; num9++) { for (var num10 = 0; num10 < 4; num10++) { if (j + num10 < num2 && i + num9 < num) { var point = new Point(j + num10, i + num9); var num11 = @struct.Uint0 & 3u; if (imgpixelFormat0 == ImgPixelFormat.Dxt1) { class2190.method_6(point, Color.FromArgb((byte)(array6[(int)((UIntPtr)num11)].Float0 * 255f), (byte)(array6[(int)((UIntPtr)num11)].Float1 * 255f), (byte)(array6[(int)((UIntPtr)num11)].Float2 * 255f), (byte)(array6[(int)((UIntPtr)num11)].Float3 * 255f))); } else { class2190.method_6(point, Color.FromArgb((byte)(array[num9 * 4 + num10].Float0 * 255f), (byte)(array6[(int)((UIntPtr)num11)].Float1 * 255f), (byte)(array6[(int)((UIntPtr)num11)].Float2 * 255f), (byte)(array6[(int)((UIntPtr)num11)].Float3 * 255f))); } } @struct.Uint0 >>= 2; } } } } }