private Texture2D IndexedToTexture(SpriteFrameData frame)
        {
            var image = new Texture2D(frame.Width, frame.Height, TextureFormat.ARGB32, false);

            image.wrapMode            = TextureWrapMode.Clamp;
            image.alphaIsTransparency = true;

            var colors = new Color[frame.Width * frame.Height];

            for (var y = 0; y < frame.Height; y++)
            {
                for (var x = 0; x < frame.Width; x++)
                {
                    var index1 = frame.Data[x + y * frame.Width] * 4;

                    var r = paletteData[index1 + 0];
                    var g = paletteData[index1 + 1];
                    var b = paletteData[index1 + 2];
                    var a = index1 > 0 ? 255 : 0;

                    var color = new Color(r / 255f, g / 255f, b / 255f, a / 255f);


                    colors[x + (frame.Height - y - 1) * frame.Width] = color;
                    //image.SetPixel(x, frame.Height - y - 1, color);
                }
            }

            ExtendSpriteTextureData(colors, frame);

            image.SetPixels(colors);

            return(image);
        }
        private Texture2D RgbaToTexture(SpriteFrameData frame)
        {
            var image = new Texture2D(frame.Width, frame.Height, TextureFormat.ARGB32, false);

            image.wrapMode            = TextureWrapMode.Clamp;
            image.alphaIsTransparency = true;

            var colors = new Color[frame.Width * frame.Height];

            //Debug.Log(frame.Width + " " + frame.Height);

            for (var y = 0; y < frame.Height; y++)
            {
                for (var x = 0; x < frame.Width; x++)
                {
                    var pos = (x + (frame.Height - y - 1) * frame.Width) * 4;

                    var r = frame.Data[pos + 3];
                    var g = frame.Data[pos + 2];
                    var b = frame.Data[pos + 1];
                    var a = frame.Data[pos + 0];

                    var color = new Color(r / 255f, g / 255f, b / 255f, a / 255f);

                    colors[x + (frame.Height - y - 1) * frame.Width] = color;
                }
            }

            ExtendSpriteTextureData(colors, frame);

            image.SetPixels(colors);

            return(image);
        }
        private void ExtendSpriteTextureData(Color[] colors, SpriteFrameData frame)
        {
            //we're going to extend the sprite color into the transparent area around the sprite
            //this is to make bilinear filtering work good with the sprite

            for (var y = 0; y < frame.Height; y++)
            {
                for (var x = 0; x < frame.Width; x++)
                {
                    var count = 0;
                    var r     = 0f;
                    var g     = 0f;
                    var b     = 0f;

                    var color = colors[x + y * frame.Width];
                    if (!Mathf.Approximately(color.a, 0))
                    {
                        continue;
                    }

                    for (var y2 = -1; y2 <= 1; y2++)
                    {
                        for (var x2 = -1; x2 <= 1; x2++)
                        {
                            if (y + y2 < 0 || y + y2 >= frame.Height)
                            {
                                continue;
                            }
                            if (x + x2 < 0 || x + x2 >= frame.Width)
                            {
                                continue;
                            }
                            var color2 = colors[x + x2 + (y + y2) * frame.Width];

                            if (Mathf.Approximately(color2.a, 0))
                            {
                                continue;
                            }

                            count++;

                            r += color2.r;
                            g += color2.g;
                            b += color2.b;
                        }
                    }

                    if (count > 0)
                    {
                        colors[x + y * frame.Width] = new Color(r / count, g / count, b / count, 0);
                    }
                }
            }
        }
        private void ReadRgbaImage()
        {
            for (var i = 0; i < rgbaCount; i++)
            {
                var width  = br.ReadInt16();
                var height = br.ReadInt16();

                var frame = new SpriteFrameData()
                {
                    IsIndexed = false,
                    Width     = width,
                    Height    = height,
                    Data      = br.ReadBytes(width * height * 4)
                };

                spriteFrames.Add(frame);
            }
        }
        private void ReadRleIndexedImage()
        {
            for (var i = 0; i < indexCount; i++)
            {
                var width  = br.ReadUInt16();
                var height = br.ReadUInt16();
                var size   = width * height;
                var data   = new byte[size];
                var index  = 0;
                var end    = br.ReadUInt16() + fs.Position;

                while (fs.Position < end)
                {
                    var c = br.ReadByte();
                    data[index++] = c;

                    if (c == 0)
                    {
                        var count = br.ReadByte();
                        if (count == 0)
                        {
                            data[index++] = count;
                        }
                        else
                        {
                            for (var j = 1; j < count; j++)
                            {
                                data[index++] = c;
                            }
                        }
                    }
                }

                var frame = new SpriteFrameData()
                {
                    IsIndexed = true,
                    Width     = width,
                    Height    = height,
                    Data      = data
                };

                spriteFrames.Add(frame);
            }
        }
        private void ReadIndexedImage()
        {
            for (var i = 0; i < indexCount; i++)
            {
                var width  = br.ReadUInt16();
                var height = br.ReadUInt16();
                var data   = br.ReadBytes(width * height);

                var frame = new SpriteFrameData()
                {
                    IsIndexed = true,
                    Width     = width,
                    Height    = height,
                    Data      = data
                };

                spriteFrames.Add(frame);
            }
        }