Exemplo n.º 1
0
        public static SheetType FrameTypeToSheetType(SpriteFrameType t)
        {
            switch (t)
            {
            case SpriteFrameType.Indexed: return(SheetType.Indexed);

            case SpriteFrameType.BGRA: return(SheetType.BGRA);

            default: throw new NotImplementedException("Unknown SpriteFrameType {0}".F(t));
            }
        }
Exemplo n.º 2
0
        public static SheetType FrameTypeToSheetType(SpriteFrameType t)
        {
            switch (t)
            {
            case SpriteFrameType.Indexed8:
                return(SheetType.Indexed);

            // Util.FastCopyIntoChannel will automatically convert these to BGRA
            case SpriteFrameType.Bgra32:
            case SpriteFrameType.Bgr24:
            case SpriteFrameType.Rgba32:
            case SpriteFrameType.Rgb24:
                return(SheetType.BGRA);

            default: throw new NotImplementedException($"Unknown SpriteFrameType {t}");
            }
        }
Exemplo n.º 3
0
 public Sprite Add(byte[] src, SpriteFrameType type, Size size)
 {
     return(Add(src, type, size, 0, float3.Zero));
 }
Exemplo n.º 4
0
 public Sprite Add(byte[] src, SpriteFrameType type, Size size, float zRamp, in float3 spriteOffset)
Exemplo n.º 5
0
        public Png(byte[] data, SpriteFrameType type, int width, int height, Color[] palette = null,
                   Dictionary <string, string> embeddedData = null)
        {
            var expectLength = width * height;

            if (palette == null)
            {
                expectLength *= 4;
            }

            if (data.Length != expectLength)
            {
                throw new InvalidDataException("Input data does not match expected length");
            }

            Type   = type;
            Width  = width;
            Height = height;

            switch (type)
            {
            case SpriteFrameType.Indexed8:
            case SpriteFrameType.Rgba32:
            case SpriteFrameType.Rgb24:
            {
                // Data is already in a compatible format
                Data = data;
                if (type == SpriteFrameType.Indexed8)
                {
                    Palette = palette;
                }

                break;
            }

            case SpriteFrameType.Bgra32:
            case SpriteFrameType.Bgr24:
            {
                // Convert to big endian
                Data = new byte[data.Length];
                var stride = PixelStride;
                for (var i = 0; i < width * height; i++)
                {
                    Data[stride * i]     = data[stride * i + 2];
                    Data[stride * i + 1] = data[stride * i + 1];
                    Data[stride * i + 2] = data[stride * i + 0];

                    if (type == SpriteFrameType.Bgra32)
                    {
                        Data[stride * i + 3] = data[stride * i + 3];
                    }
                }

                break;
            }

            default:
                throw new InvalidDataException($"Unhandled SpriteFrameType {type}");
            }

            if (embeddedData != null)
            {
                EmbeddedData = embeddedData;
            }
        }
Exemplo n.º 6
0
        public Png(Stream s)
        {
            if (!Verify(s))
            {
                throw new InvalidDataException("PNG Signature is bogus");
            }

            s.Position += 8;
            var headerParsed = false;
            var data         = new List <byte>();

            Type = SpriteFrameType.Rgba32;

            while (true)
            {
                var length  = IPAddress.NetworkToHostOrder(s.ReadInt32());
                var type    = Encoding.UTF8.GetString(s.ReadBytes(4));
                var content = s.ReadBytes(length);
                /*var crc = */ s.ReadInt32();

                if (!headerParsed && type != "IHDR")
                {
                    throw new InvalidDataException("Invalid PNG file - header does not appear first.");
                }

                using (var ms = new MemoryStream(content))
                {
                    switch (type)
                    {
                    case "IHDR":
                    {
                        if (headerParsed)
                        {
                            throw new InvalidDataException("Invalid PNG file - duplicate header.");
                        }
                        Width  = IPAddress.NetworkToHostOrder(ms.ReadInt32());
                        Height = IPAddress.NetworkToHostOrder(ms.ReadInt32());

                        var bitDepth  = ms.ReadUInt8();
                        var colorType = (PngColorType)ms.ReadByte();
                        if (IsPaletted(bitDepth, colorType))
                        {
                            Type = SpriteFrameType.Indexed8;
                        }
                        else if (colorType == PngColorType.Color)
                        {
                            Type = SpriteFrameType.Rgb24;
                        }

                        Data = new byte[Width * Height * PixelStride];

                        var compression = ms.ReadByte();
                        /*var filter = */ ms.ReadByte();
                        var interlace = ms.ReadByte();

                        if (compression != 0)
                        {
                            throw new InvalidDataException("Compression method not supported");
                        }

                        if (interlace != 0)
                        {
                            throw new InvalidDataException("Interlacing not supported");
                        }

                        headerParsed = true;

                        break;
                    }

                    case "PLTE":
                    {
                        Palette = new Color[256];
                        for (var i = 0; i < length / 3; i++)
                        {
                            var r = ms.ReadByte(); var g = ms.ReadByte(); var b = ms.ReadByte();
                            Palette[i] = Color.FromArgb(r, g, b);
                        }

                        break;
                    }

                    case "tRNS":
                    {
                        if (Palette == null)
                        {
                            throw new InvalidDataException("Non-Palette indexed PNG are not supported.");
                        }

                        for (var i = 0; i < length; i++)
                        {
                            Palette[i] = Color.FromArgb(ms.ReadByte(), Palette[i]);
                        }

                        break;
                    }

                    case "IDAT":
                    {
                        data.AddRange(content);

                        break;
                    }

                    case "tEXt":
                    {
                        var key = ms.ReadASCIIZ();
                        EmbeddedData.Add(key, ms.ReadASCII(length - key.Length - 1));

                        break;
                    }

                    case "IEND":
                    {
                        using (var ns = new MemoryStream(data.ToArray()))
                        {
                            using (var ds = new InflaterInputStream(ns))
                            {
                                var pxStride  = PixelStride;
                                var rowStride = Width * pxStride;

                                var prevLine = new byte[rowStride];
                                for (var y = 0; y < Height; y++)
                                {
                                    var filter = (PngFilter)ds.ReadByte();
                                    var line   = ds.ReadBytes(rowStride);

                                    for (var i = 0; i < rowStride; i++)
                                    {
                                        line[i] = i < pxStride
                                                                                                ? UnapplyFilter(filter, line[i], 0, prevLine[i], 0)
                                                                                                : UnapplyFilter(filter, line[i], line[i - pxStride], prevLine[i], prevLine[i - pxStride]);
                                    }

                                    Array.Copy(line, 0, Data, y * rowStride, rowStride);

                                    prevLine = line;
                                }
                            }
                        }

                        if (Type == SpriteFrameType.Indexed8 && Palette == null)
                        {
                            throw new InvalidDataException("Non-Palette indexed PNG are not supported.");
                        }

                        return;
                    }
                    }
                }
            }
        }