using System; using System.IO; using UnityEngine; namespace Gif.Components { // Token: 0x02000003 RID: 3 public class AnimatedGifEncoder { // Token: 0x06000007 RID: 7 RVA: 0x000021FA File Offset: 0x000005FA public void SetPaletteSize(int size) { if (size < 2 || size > 256) { throw new ArgumentOutOfRangeException("size", "size should be between 2 and 256"); } this.paletteSize = size; } // Token: 0x06000008 RID: 8 RVA: 0x00002226 File Offset: 0x00000626 public void SetMaxSize(int bytes) { this.limitFileSize = bytes > 0; this.maxSize = (long)bytes; } // Token: 0x06000009 RID: 9 RVA: 0x0000223B File Offset: 0x0000063B public void SetDelay(int ms) { this.delay = (int)Math.Round((double)((float)ms / 10f)); } // Token: 0x0600000A RID: 10 RVA: 0x00002253 File Offset: 0x00000653 public void SetDispose(int code) { if (code >= 0) { this.dispose = code; } } // Token: 0x0600000B RID: 11 RVA: 0x00002266 File Offset: 0x00000666 public void SetRepeat(int iter) { if (iter >= 0) { this.repeat = iter; } } // Token: 0x0600000C RID: 12 RVA: 0x00002279 File Offset: 0x00000679 public void SetTransparent(Color32 c) { this.transparent = c; } // Token: 0x0600000D RID: 13 RVA: 0x00002284 File Offset: 0x00000684 public bool AddFrame(Image im) { bool flag; if (im == null || !this.started) { flag = false; } else { try { if (!this.sizeSet) { this.SetSize(im.width, im.height); } this.image = im; this.GetImagePixels(); this.AnalyzePixels(); if (this.firstFrame) { this.WriteLSD(); this.WritePalette(); if (this.repeat >= 0) { this.WriteNetscapeExt(); } } this.WriteGraphicCtrlExt(); bool flag2 = !this.firstFrame && !this.useStaticColorPalette; this.WriteImageDesc(flag2); if (flag2) { this.WritePalette(); } this.WritePixels(); this.firstFrame = false; } catch (IOException ex) { throw ex; } flag = this.WriteTemp(); } return flag; } // Token: 0x0600000E RID: 14 RVA: 0x00002374 File Offset: 0x00000774 private bool WriteTemp() { bool flag; if (!this.limitFileSize || this.tempStream.Length + this.bytesWritten < this.maxSize) { this.bytesWritten += this.tempStream.Length; this.tempStream.WriteTo(this.gifStream); this.tempStream.Position = 0L; this.tempStream.SetLength(0L); flag = true; } else { flag = false; } return flag; } // Token: 0x0600000F RID: 15 RVA: 0x00002400 File Offset: 0x00000800 public bool Finish() { bool flag; if (!this.started) { flag = false; } else { bool flag2 = true; this.started = false; try { this.gifStream.WriteByte(59); this.gifStream.Flush(); if (this.closeStream) { this.gifStream.Close(); } } catch (IOException ex) { flag2 = false; } this.transIndex = 0; this.bytesWritten = 0L; this.tempStream = null; this.image = null; this.pixels = null; this.indexedPixels = null; this.colorTab = null; this.closeStream = false; this.firstFrame = true; this.nq = null; flag = flag2; } return flag; } // Token: 0x06000010 RID: 16 RVA: 0x000024CC File Offset: 0x000008CC public void SetFrameRate(float fps) { if (fps != 0f) { this.delay = (int)Math.Round((double)(100f / fps)); } } // Token: 0x06000011 RID: 17 RVA: 0x000024F0 File Offset: 0x000008F0 public void SetStaticColorPaletteMode(bool useStatic) { this.useStaticColorPalette = useStatic; } // Token: 0x06000012 RID: 18 RVA: 0x000024FA File Offset: 0x000008FA public void SetQuality(int quality) { if (quality < 1) { quality = 1; } this.sample = quality; } // Token: 0x06000013 RID: 19 RVA: 0x00002510 File Offset: 0x00000910 public void SetSize(int w, int h) { if (!this.started || this.firstFrame) { this.width = w; this.height = h; if (this.width < 1) { this.width = 320; } if (this.height < 1) { this.height = 240; } this.sizeSet = true; } } // Token: 0x06000014 RID: 20 RVA: 0x0000257C File Offset: 0x0000097C public bool Start(Stream os) { bool flag; if (os == null) { flag = false; } else { this.closeStream = false; this.gifStream = os; try { this.WriteString("GIF89a"); } catch (IOException ex) { throw ex; } bool flag2 = this.WriteTemp(); flag = (this.started = flag2); } return flag; } // Token: 0x06000015 RID: 21 RVA: 0x000025E8 File Offset: 0x000009E8 public bool Start(string file) { bool flag = true; try { this.gifStream = new FileStream(file, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None); flag = this.Start(this.tempStream); this.closeStream = true; } catch (IOException ex) { throw ex; } return this.started = flag; } // Token: 0x06000016 RID: 22 RVA: 0x00002648 File Offset: 0x00000A48 protected void AnalyzePixels() { int num = this.pixels.Length; int num2 = num / 3; this.indexedPixels = new byte[num2]; if (this.nq == null || !this.useStaticColorPalette) { this.nq = new NeuQuant(this.pixels, num, this.sample, this.paletteSize); this.colorTab = this.nq.Process(); } int num3 = 0; for (int i = 0; i < num2; i++) { int num4 = this.nq.Map((int)(this.pixels[num3++] & byte.MaxValue), (int)(this.pixels[num3++] & byte.MaxValue), (int)(this.pixels[num3++] & byte.MaxValue)); this.usedEntry[num4] = true; this.indexedPixels[i] = (byte)num4; } this.pixels = null; this.colorDepth = 8; this.palSize = 7; if (this.transparent.Equals(default(Color32))) { this.transIndex = this.FindClosest(this.transparent); } } // Token: 0x06000017 RID: 23 RVA: 0x00002774 File Offset: 0x00000B74 protected int FindClosest(Color32 c) { int num; if (this.colorTab == null) { num = -1; } else { int r = (int)c.r; int g = (int)c.g; int b = (int)c.b; int num2 = 0; int num3 = 16777216; int num4 = this.colorTab.Length; for (int i = 0; i < num4; i++) { int num5 = r - (int)(this.colorTab[i++] & byte.MaxValue); int num6 = g - (int)(this.colorTab[i++] & byte.MaxValue); int num7 = b - (int)(this.colorTab[i] & byte.MaxValue); int num8 = num5 * num5 + num6 * num6 + num7 * num7; int num9 = i / 3; if (this.usedEntry[num9] && num8 < num3) { num3 = num8; num2 = num9; } } num = num2; } return num; } // Token: 0x06000018 RID: 24 RVA: 0x00002860 File Offset: 0x00000C60 protected void GetImagePixels() { int num = this.image.width; int num2 = this.image.height; if (num != this.width || num2 != this.height) { Image image = new Image(this.width, this.height); throw new NotImplementedException("meh"); } this.pixels = new byte[3 * this.image.width * this.image.height]; int num3 = 0; for (int i = 0; i < this.image.height; i++) { for (int j = 0; j < this.image.width; j++) { Color32 color = this.image[j, i]; this.pixels[num3] = color.r; num3++; this.pixels[num3] = color.g; num3++; this.pixels[num3] = color.b; num3++; } } } // Token: 0x06000019 RID: 25 RVA: 0x00002970 File Offset: 0x00000D70 protected void WriteGraphicCtrlExt() { this.tempStream.WriteByte(33); this.tempStream.WriteByte(249); this.tempStream.WriteByte(4); int num; int num2; if (this.transparent.Equals(default(Color32))) { num = 0; num2 = 0; } else { num = 1; num2 = 2; } if (this.dispose >= 0) { num2 = this.dispose & 7; } num2 <<= 2; this.tempStream.WriteByte(Convert.ToByte(0 | num2 | 0 | num)); this.WriteShort(this.delay); this.tempStream.WriteByte(Convert.ToByte(this.transIndex)); this.tempStream.WriteByte(0); } // Token: 0x0600001A RID: 26 RVA: 0x00002A3C File Offset: 0x00000E3C protected void WriteImageDesc(bool localPalette) { this.tempStream.WriteByte(44); this.WriteShort(0); this.WriteShort(0); this.WriteShort(this.width); this.WriteShort(this.height); if (this.firstFrame) { this.tempStream.WriteByte(0); } else { this.tempStream.WriteByte(Convert.ToByte(((!localPalette) ? 0 : 128) | 0 | 0 | 0 | this.palSize)); } } // Token: 0x0600001B RID: 27 RVA: 0x00002ACC File Offset: 0x00000ECC protected void WriteLSD() { this.WriteShort(this.width); this.WriteShort(this.height); this.tempStream.WriteByte(Convert.ToByte(240 | this.palSize)); this.tempStream.WriteByte(0); this.tempStream.WriteByte(0); } // Token: 0x0600001C RID: 28 RVA: 0x00002B28 File Offset: 0x00000F28 protected void WriteNetscapeExt() { this.tempStream.WriteByte(33); this.tempStream.WriteByte(byte.MaxValue); this.tempStream.WriteByte(11); this.WriteString("NETSCAPE2.0"); this.tempStream.WriteByte(3); this.tempStream.WriteByte(1); this.WriteShort(this.repeat); this.tempStream.WriteByte(0); } // Token: 0x0600001D RID: 29 RVA: 0x00002B9C File Offset: 0x00000F9C protected void WritePalette() { this.tempStream.Write(this.colorTab, 0, this.colorTab.Length); int num = 768 - this.colorTab.Length; for (int i = 0; i < num; i++) { this.tempStream.WriteByte(0); } } // Token: 0x0600001E RID: 30 RVA: 0x00002BF4 File Offset: 0x00000FF4 protected void WritePixels() { LZWEncoder lzwencoder = new LZWEncoder(this.width, this.height, this.indexedPixels, this.colorDepth); lzwencoder.Encode(this.tempStream); } // Token: 0x0600001F RID: 31 RVA: 0x00002C2C File Offset: 0x0000102C protected void WriteShort(int value) { this.tempStream.WriteByte(Convert.ToByte(value & 255)); this.tempStream.WriteByte(Convert.ToByte((value >> 8) & 255)); } // Token: 0x06000020 RID: 32 RVA: 0x00002C60 File Offset: 0x00001060 protected void WriteString(string s) { char[] array = s.ToCharArray(); for (int i = 0; i < array.Length; i++) { this.tempStream.WriteByte((byte)array[i]); } } // Token: 0x04000004 RID: 4 protected int width; // Token: 0x04000005 RID: 5 protected int height; // Token: 0x04000006 RID: 6 protected Color32 transparent = new Color32(0, 0, 0, 0); // Token: 0x04000007 RID: 7 protected int transIndex; // Token: 0x04000008 RID: 8 protected int repeat = -1; // Token: 0x04000009 RID: 9 protected int delay = 0; // Token: 0x0400000A RID: 10 protected bool started = false; // Token: 0x0400000B RID: 11 protected MemoryStream tempStream = new MemoryStream(); // Token: 0x0400000C RID: 12 protected Stream gifStream; // Token: 0x0400000D RID: 13 protected int paletteSize = 256; // Token: 0x0400000E RID: 14 protected Image image; // Token: 0x0400000F RID: 15 protected byte[] pixels; // Token: 0x04000010 RID: 16 protected byte[] indexedPixels; // Token: 0x04000011 RID: 17 protected int colorDepth; // Token: 0x04000012 RID: 18 protected byte[] colorTab; // Token: 0x04000013 RID: 19 protected bool[] usedEntry = new bool[256]; // Token: 0x04000014 RID: 20 protected int palSize = 7; // Token: 0x04000015 RID: 21 protected int dispose = -1; // Token: 0x04000016 RID: 22 protected bool closeStream = false; // Token: 0x04000017 RID: 23 protected bool firstFrame = true; // Token: 0x04000018 RID: 24 protected bool sizeSet = false; // Token: 0x04000019 RID: 25 protected int sample = 10; // Token: 0x0400001A RID: 26 protected long maxSize = long.MaxValue; // Token: 0x0400001B RID: 27 protected bool limitFileSize = false; // Token: 0x0400001C RID: 28 protected long bytesWritten = 0L; // Token: 0x0400001D RID: 29 protected bool useStaticColorPalette; // Token: 0x0400001E RID: 30 private NeuQuant nq; } }