diff --git a/ArcFormats/ArcFormats.csproj b/ArcFormats/ArcFormats.csproj index e154c359..2a28fc93 100644 --- a/ArcFormats/ArcFormats.csproj +++ b/ArcFormats/ArcFormats.csproj @@ -205,6 +205,7 @@ + diff --git a/ArcFormats/ImageRCG.cs b/ArcFormats/ImageRCG.cs new file mode 100644 index 00000000..b6e66078 --- /dev/null +++ b/ArcFormats/ImageRCG.cs @@ -0,0 +1,64 @@ +using System.ComponentModel.Composition; +using System.IO; +using System.Windows.Media; +using GameRes.Compression; + +namespace GameRes.Formats +{ + [Export(typeof(ImageFormat))] + public class ImageRCG : ImageFormat + { + public override string Tag + { + get { return "RCG"; } + } + + public override string Description + { + get { return "Rave RCG image format"; } + } + + public override uint Signature + { + get { return 0x31520018; } + } + + public override bool CanWrite + { + get { return false; } + } + + public override ImageMetaData ReadMetaData(IBinaryStream stream) + { + stream.Position = 4; + var meta = new ImageMetaData(); + meta.BPP = 24; + meta.Width = stream.ReadUInt16(); + meta.Height = stream.ReadUInt16(); + meta.OffsetX = 0; + meta.OffsetY = 0; + // Skip 8 bytes unknown fields + stream.Position += 8; + var compressed_size = stream.ReadUInt32(); + return compressed_size != stream.Length - 24 ? null : meta; + } + + public override ImageData Read(IBinaryStream stream, ImageMetaData info) + { + stream.Position = 20; + var uncompressed_size = stream.ReadUInt32(); + var data = new byte[uncompressed_size]; + using (var zstream = new ZLibStream(stream.AsStream, CompressionMode.Decompress, true)) + { + return uncompressed_size != zstream.Read(data, 0, (int)uncompressed_size) + ? null + : ImageData.Create(info, PixelFormats.Rgb24, null, data); + } + } + + public override void Write(Stream file, ImageData image) + { + throw new System.NotImplementedException("RCGFormat.Write not implemented"); + } + } +} \ No newline at end of file