예제 #1
0
        internal void ReadPalette(BinaryReader reader, GfxPaletteInfo paletteInfo)
        {
            reader.BaseStream.Seek(paletteInfo.PaletteOffset, SeekOrigin.Begin);
            for (var i = 0; i < paletteInfo.PaletteColourCount; i++)
            {
                var paletteEntry = reader.ByteToType <GfxPaletteEntry>();

                paletteEntry.MultiplyBy(4);
                this[paletteInfo.FirstPaletteColourIndex + i] = paletteEntry.ToColor();
            }
        }
예제 #2
0
        public static IEnumerable <Image <Rgba32> > ConvertToBmps(Stream stream)
        {
            if (stream == null)
            {
                throw new ArgumentNullException(nameof(stream));
            }

            if (!stream.CanRead || stream.CanSeek)
            {
                throw new ArgumentException($"Argument '{nameof(stream)}' must support reading and seeking");
            }

            using (var reader = new BinaryReader(stream, Encoding.Default, false))
            {
                GfxHeader header = reader.ByteToType <GfxHeader>();

                List <int> offsets = new List <int>();
                for (int i = 0; i <= header.BitmapCount; i++)
                {
                    offsets.Add(reader.ReadInt32());
                }

                GfxPaletteInfo paletteInfo = header.CreatePaletteInfo(reader);
                ImgSize        size        = new ImgSize(header.Width, header.Height);

                using (Image <Rgba32> img = new Image <Rgba32>(header.Width, header.Height))
                {
                    Painter painter = CreatePainter(img, reader, paletteInfo);

                    for (int i = 0; i < header.BitmapCount; i++)
                    {
                        var bmpStart  = offsets[i];
                        var imgLength = offsets[i + 1] - offsets[i];

                        reader.BaseStream.Seek(bmpStart, SeekOrigin.Begin);
                        byte[] imgBytes = reader.ReadBytes(imgLength);

                        if (ShouldResetImage(i, imgBytes))
                        {
                            painter.ResetImage();
                        }

                        Decode(painter, size, imgBytes);

                        yield return(new Image <Rgba32>(img));
                    }
                }
            }
        }
예제 #3
0
        private static Painter CreatePainter(Image <Rgba32> image, BinaryReader reader, GfxPaletteInfo paletteInfo)
        {
            Painter painter = new Painter(image);

            if (paletteInfo.PaletteOffset > 0)
            {
                painter.ReadPalette(reader, paletteInfo);
            }

            painter.DefaultRleVal = paletteInfo.FirstPaletteColourIndex + paletteInfo.PaletteColourCount;
            return(painter);
        }