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(); } }
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)); } } } }
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); }