using System; using System.Collections; using System.IO; using UnityEngine; namespace Gif.Components { // Token: 0x02000006 RID: 6 public class GifDecoder { // Token: 0x06000023 RID: 35 RVA: 0x00002CFC File Offset: 0x000010FC public int GetDelay(int n) { this.delay = -1; if (n >= 0 && n < this.frameCount) { this.delay = ((GifDecoder.GifFrame)this.frames[n]).delay; } return this.delay; } // Token: 0x06000024 RID: 36 RVA: 0x00002D50 File Offset: 0x00001150 public int GetFrameCount() { return this.frameCount; } // Token: 0x06000025 RID: 37 RVA: 0x00002D6C File Offset: 0x0000116C public Image GetImage() { return this.GetFrame(0); } // Token: 0x06000026 RID: 38 RVA: 0x00002D88 File Offset: 0x00001188 public int GetLoopCount() { return this.loopCount; } // Token: 0x06000027 RID: 39 RVA: 0x00002DA4 File Offset: 0x000011A4 private int[] GetPixels(Image bitmap) { int[] array = new int[3 * this.image.width * this.image.height]; int num = 0; for (int i = 0; i < this.image.height; i++) { for (int j = 0; j < this.image.width; j++) { Color32 color = bitmap[j, i]; array[num] = (int)color.r; num++; array[num] = (int)color.g; num++; array[num] = (int)color.b; num++; } } return array; } // Token: 0x06000028 RID: 40 RVA: 0x00002E50 File Offset: 0x00001250 private void SetPixels(int[] pixels) { int num = 0; for (int i = 0; i < this.image.height; i++) { for (int j = 0; j < this.image.width; j++) { int num2 = pixels[num++]; byte b = (byte)((num2 >> 16) & 255); byte b2 = (byte)((num2 >> 8) & 255); byte b3 = (byte)((num2 >> 0) & 255); byte b4 = (byte)((num2 >> 24) & 255); Color32 color = new Color32(b, b2, b3, b4); this.bitmap[j, i] = color; } } } // Token: 0x06000029 RID: 41 RVA: 0x00002EF4 File Offset: 0x000012F4 protected void SetPixels() { int[] array = this.GetPixels(this.bitmap); if (this.lastDispose > 0) { if (this.lastDispose == 3) { int num = this.frameCount - 2; if (num > 0) { this.lastImage = this.GetFrame(num - 1); } else { this.lastImage = null; } } if (this.lastImage != null) { int[] array2 = this.GetPixels(this.lastImage); Array.Copy(array2, 0, array, 0, this.width * this.height); if (this.lastDispose == 2) { Color32 color = default(Color32); if (this.transparency) { color = new Color32(0, 0, 0, 0); } else { int num2 = this.lastBgColor; byte b = (byte)((num2 >> 16) & 255); byte b2 = (byte)((num2 >> 8) & 255); byte b3 = (byte)((num2 >> 0) & 255); byte b4 = (byte)((num2 >> 24) & 255); color = new Color32(b, b2, b3, b4); } this.image.Fill(color, this.lastRect.xmin, this.lastRect.ymin, this.lastRect.xmax, this.lastRect.ymax); } } } int num3 = 1; int num4 = 8; int num5 = 0; for (int i = 0; i < this.ih; i++) { int num6 = i; if (this.interlace) { if (num5 >= this.ih) { num3++; if (num3 != 2) { if (num3 != 3) { if (num3 == 4) { num5 = 1; num4 = 2; } } else { num5 = 2; num4 = 4; } } else { num5 = 4; } } num6 = num5; num5 += num4; } num6 += this.iy; if (num6 < this.height) { int num7 = num6 * this.width; int j = num7 + this.ix; int num8 = j + this.iw; if (num7 + this.width < num8) { num8 = num7 + this.width; } int num9 = i * this.iw; while (j < num8) { int num10 = (int)(this.pixels[num9++] & byte.MaxValue); int num11 = this.act[num10]; if (num11 != 0) { array[j] = num11; } j++; } } } this.SetPixels(array); } // Token: 0x0600002A RID: 42 RVA: 0x00003188 File Offset: 0x00001588 public Image GetFrame(int n) { Image image = null; if (n >= 0 && n < this.frameCount) { image = ((GifDecoder.GifFrame)this.frames[n]).image; } return image; } // Token: 0x0600002B RID: 43 RVA: 0x000031CC File Offset: 0x000015CC public Size GetFrameSize() { return new Size(this.width, this.height); } // Token: 0x0600002C RID: 44 RVA: 0x000031F4 File Offset: 0x000015F4 public int Read(Stream inStream) { this.Init(); if (inStream != null) { this.inStream = inStream; this.ReadHeader(); if (!this.Error()) { this.ReadContents(); if (this.frameCount < 0) { this.status = GifDecoder.STATUS_FORMAT_ERROR; } } inStream.Close(); } else { this.status = GifDecoder.STATUS_OPEN_ERROR; } return this.status; } // Token: 0x0600002D RID: 45 RVA: 0x00003270 File Offset: 0x00001670 public int Read(string name) { this.status = GifDecoder.STATUS_OK; try { name = name.Trim().ToLower(); this.status = this.Read(new FileInfo(name).OpenRead()); } catch (IOException ex) { this.status = GifDecoder.STATUS_OPEN_ERROR; } return this.status; } // Token: 0x0600002E RID: 46 RVA: 0x000032E4 File Offset: 0x000016E4 protected void DecodeImageData() { int num = -1; int num2 = this.iw * this.ih; if (this.pixels == null || this.pixels.Length < num2) { this.pixels = new byte[num2]; } if (this.prefix == null) { this.prefix = new short[GifDecoder.MaxStackSize]; } if (this.suffix == null) { this.suffix = new byte[GifDecoder.MaxStackSize]; } if (this.pixelStack == null) { this.pixelStack = new byte[GifDecoder.MaxStackSize + 1]; } int num3 = this.Read(); int num4 = 1 << num3; int num5 = num4 + 1; int num6 = num4 + 2; int num7 = num; int num8 = num3 + 1; int num9 = (1 << num8) - 1; for (int i = 0; i < num4; i++) { this.prefix[i] = 0; this.suffix[i] = (byte)i; } int num16; int num15; int num14; int num13; int num12; int num11; int num10 = (num11 = (num12 = (num13 = (num14 = (num15 = (num16 = 0)))))); for (int j = 0; j < num2; j++) { if (num14 == 0) { if (num10 < num8) { if (num12 == 0) { num12 = this.ReadBlock(); if (num12 <= 0) { break; } num16 = 0; } num11 += (int)(this.block[num16] & byte.MaxValue) << num10; num10 += 8; num16++; num12--; continue; } int i = num11 & num9; num11 >>= num8; num10 -= num8; if (i > num6 || i == num5) { break; } if (i == num4) { num8 = num3 + 1; num9 = (1 << num8) - 1; num6 = num4 + 2; num7 = num; continue; } if (num7 == num) { this.pixelStack[num14++] = this.suffix[i]; num7 = i; num13 = i; continue; } int num17 = i; if (i == num6) { this.pixelStack[num14++] = (byte)num13; i = num7; } while (i > num4) { this.pixelStack[num14++] = this.suffix[i]; i = (int)this.prefix[i]; } num13 = (int)(this.suffix[i] & byte.MaxValue); if (num6 >= GifDecoder.MaxStackSize) { break; } this.pixelStack[num14++] = (byte)num13; this.prefix[num6] = (short)num7; this.suffix[num6] = (byte)num13; num6++; if ((num6 & num9) == 0 && num6 < GifDecoder.MaxStackSize) { num8++; num9 += num6; } num7 = num17; } num14--; this.pixels[num15++] = this.pixelStack[num14]; } for (int j = num15; j < num2; j++) { this.pixels[j] = 0; } } // Token: 0x0600002F RID: 47 RVA: 0x000035F0 File Offset: 0x000019F0 protected bool Error() { return this.status != GifDecoder.STATUS_OK; } // Token: 0x06000030 RID: 48 RVA: 0x00003615 File Offset: 0x00001A15 protected void Init() { this.status = GifDecoder.STATUS_OK; this.frameCount = 0; this.frames = new ArrayList(); this.gct = null; this.lct = null; } // Token: 0x06000031 RID: 49 RVA: 0x00003644 File Offset: 0x00001A44 protected int Read() { int num = 0; try { num = this.inStream.ReadByte(); } catch (IOException ex) { this.status = GifDecoder.STATUS_FORMAT_ERROR; } return num; } // Token: 0x06000032 RID: 50 RVA: 0x00003694 File Offset: 0x00001A94 protected int ReadBlock() { this.blockSize = this.Read(); int i = 0; if (this.blockSize > 0) { try { while (i < this.blockSize) { int num = this.inStream.Read(this.block, i, this.blockSize - i); if (num == -1) { break; } i += num; } } catch (IOException ex) { } if (i < this.blockSize) { this.status = GifDecoder.STATUS_FORMAT_ERROR; } } return i; } // Token: 0x06000033 RID: 51 RVA: 0x00003740 File Offset: 0x00001B40 protected int[] ReadColorTable(int ncolors) { int num = 3 * ncolors; int[] array = null; byte[] array2 = new byte[num]; int num2 = 0; try { num2 = this.inStream.Read(array2, 0, array2.Length); } catch (IOException ex) { } if (num2 < num) { this.status = GifDecoder.STATUS_FORMAT_ERROR; } else { array = new int[256]; int i = 0; int num3 = 0; while (i < ncolors) { int num4 = (int)(array2[num3++] & byte.MaxValue); int num5 = (int)(array2[num3++] & byte.MaxValue); int num6 = (int)(array2[num3++] & byte.MaxValue); array[i++] = (int)((ulong)(-16777216) | (ulong)((long)((long)num4 << 16)) | (ulong)((long)((long)num5 << 8)) | (ulong)((long)num6)); } } return array; } // Token: 0x06000034 RID: 52 RVA: 0x00003828 File Offset: 0x00001C28 protected void ReadContents() { bool flag = false; while (!flag && !this.Error()) { int num = this.Read(); if (num != 0) { if (num != 33) { if (num != 44) { if (num != 59) { this.status = GifDecoder.STATUS_FORMAT_ERROR; } else { flag = true; } } else { this.ReadImage(); } } else { num = this.Read(); if (num != 249) { if (num != 255) { this.Skip(); } else { this.ReadBlock(); string text = ""; for (int i = 0; i < 11; i++) { text += (char)this.block[i]; } if (text.Equals("NETSCAPE2.0")) { this.ReadNetscapeExt(); } else { this.Skip(); } } } else { this.ReadGraphicControlExt(); } } } } } // Token: 0x06000035 RID: 53 RVA: 0x00003940 File Offset: 0x00001D40 protected void ReadGraphicControlExt() { this.Read(); int num = this.Read(); this.dispose = (num & 28) >> 2; if (this.dispose == 0) { this.dispose = 1; } this.transparency = (num & 1) != 0; this.delay = this.ReadShort() * 10; this.transIndex = this.Read(); this.Read(); } // Token: 0x06000036 RID: 54 RVA: 0x000039B0 File Offset: 0x00001DB0 protected void ReadHeader() { string text = ""; for (int i = 0; i < 6; i++) { text += (char)this.Read(); } if (!text.StartsWith("GIF")) { this.status = GifDecoder.STATUS_FORMAT_ERROR; } else { this.ReadLSD(); if (this.gctFlag && !this.Error()) { this.gct = this.ReadColorTable(this.gctSize); this.bgColor = this.gct[this.bgIndex]; } } } // Token: 0x06000037 RID: 55 RVA: 0x00003A50 File Offset: 0x00001E50 protected void ReadImage() { this.ix = this.ReadShort(); this.iy = this.ReadShort(); this.iw = this.ReadShort(); this.ih = this.ReadShort(); int num = this.Read(); this.lctFlag = (num & 128) != 0; this.interlace = (num & 64) != 0; this.lctSize = 2 << (num & 7); if (this.lctFlag) { this.lct = this.ReadColorTable(this.lctSize); this.act = this.lct; } else { this.act = this.gct; if (this.bgIndex == this.transIndex) { this.bgColor = 0; } } int num2 = 0; if (this.transparency) { num2 = this.act[this.transIndex]; this.act[this.transIndex] = 0; } if (this.act == null) { this.status = GifDecoder.STATUS_FORMAT_ERROR; } if (!this.Error()) { this.DecodeImageData(); this.Skip(); if (!this.Error()) { this.frameCount++; this.bitmap = new Image(this.width, this.height); this.image = this.bitmap; this.SetPixels(); this.frames.Add(new GifDecoder.GifFrame(this.bitmap, this.delay)); if (this.transparency) { this.act[this.transIndex] = num2; } this.ResetFrame(); } } } // Token: 0x06000038 RID: 56 RVA: 0x00003C00 File Offset: 0x00002000 protected void ReadLSD() { this.width = this.ReadShort(); this.height = this.ReadShort(); int num = this.Read(); this.gctFlag = (num & 128) != 0; this.gctSize = 2 << (num & 7); this.bgIndex = this.Read(); this.pixelAspect = this.Read(); } // Token: 0x06000039 RID: 57 RVA: 0x00003C68 File Offset: 0x00002068 protected void ReadNetscapeExt() { do { this.ReadBlock(); if (this.block[0] == 1) { int num = (int)(this.block[1] & byte.MaxValue); int num2 = (int)(this.block[2] & byte.MaxValue); this.loopCount = (num2 << 8) | num; } } while (this.blockSize > 0 && !this.Error()); } // Token: 0x0600003A RID: 58 RVA: 0x00003CD0 File Offset: 0x000020D0 protected int ReadShort() { return this.Read() | (this.Read() << 8); } // Token: 0x0600003B RID: 59 RVA: 0x00003CF4 File Offset: 0x000020F4 protected void ResetFrame() { this.lastDispose = this.dispose; this.lastRect = new Rectangle { xmin = this.ix, ymin = this.iy, xmax = this.ix + this.iw, ymax = this.iy + this.ih }; this.lastImage = this.image; this.lastBgColor = this.bgColor; this.lct = null; } // Token: 0x0600003C RID: 60 RVA: 0x00003D82 File Offset: 0x00002182 protected void Skip() { do { this.ReadBlock(); } while (this.blockSize > 0 && !this.Error()); } // Token: 0x04000025 RID: 37 public static readonly int STATUS_OK = 0; // Token: 0x04000026 RID: 38 public static readonly int STATUS_FORMAT_ERROR = 1; // Token: 0x04000027 RID: 39 public static readonly int STATUS_OPEN_ERROR = 2; // Token: 0x04000028 RID: 40 protected Stream inStream; // Token: 0x04000029 RID: 41 protected int status; // Token: 0x0400002A RID: 42 protected int width; // Token: 0x0400002B RID: 43 protected int height; // Token: 0x0400002C RID: 44 protected bool gctFlag; // Token: 0x0400002D RID: 45 protected int gctSize; // Token: 0x0400002E RID: 46 protected int loopCount = 1; // Token: 0x0400002F RID: 47 protected int[] gct; // Token: 0x04000030 RID: 48 protected int[] lct; // Token: 0x04000031 RID: 49 protected int[] act; // Token: 0x04000032 RID: 50 protected int bgIndex; // Token: 0x04000033 RID: 51 protected int bgColor; // Token: 0x04000034 RID: 52 protected int lastBgColor; // Token: 0x04000035 RID: 53 protected int pixelAspect; // Token: 0x04000036 RID: 54 protected bool lctFlag; // Token: 0x04000037 RID: 55 protected bool interlace; // Token: 0x04000038 RID: 56 protected int lctSize; // Token: 0x04000039 RID: 57 protected int ix; // Token: 0x0400003A RID: 58 protected int iy; // Token: 0x0400003B RID: 59 protected int iw; // Token: 0x0400003C RID: 60 protected int ih; // Token: 0x0400003D RID: 61 protected Rectangle lastRect; // Token: 0x0400003E RID: 62 protected Image image; // Token: 0x0400003F RID: 63 protected Image bitmap; // Token: 0x04000040 RID: 64 protected Image lastImage; // Token: 0x04000041 RID: 65 protected byte[] block = new byte[256]; // Token: 0x04000042 RID: 66 protected int blockSize = 0; // Token: 0x04000043 RID: 67 protected int dispose = 0; // Token: 0x04000044 RID: 68 protected int lastDispose = 0; // Token: 0x04000045 RID: 69 protected bool transparency = false; // Token: 0x04000046 RID: 70 protected int delay = 0; // Token: 0x04000047 RID: 71 protected int transIndex; // Token: 0x04000048 RID: 72 protected static readonly int MaxStackSize = 4096; // Token: 0x04000049 RID: 73 protected short[] prefix; // Token: 0x0400004A RID: 74 protected byte[] suffix; // Token: 0x0400004B RID: 75 protected byte[] pixelStack; // Token: 0x0400004C RID: 76 protected byte[] pixels; // Token: 0x0400004D RID: 77 protected ArrayList frames; // Token: 0x0400004E RID: 78 protected int frameCount; // Token: 0x02000007 RID: 7 public class GifFrame { // Token: 0x0600003E RID: 62 RVA: 0x00003DC3 File Offset: 0x000021C3 public GifFrame(Image im, int del) { this.image = im; this.delay = del; } // Token: 0x0400004F RID: 79 public Image image; // Token: 0x04000050 RID: 80 public int delay; } } }