From 04346233082b3b9be1c98b6e6844689927f97f00 Mon Sep 17 00:00:00 2001 From: ManicSteiner Date: Sat, 16 Dec 2023 21:46:17 +0800 Subject: [PATCH] feat: SPC-PS2 Image Format --- ArcFormats/ArcFormats.csproj | 1 + ArcFormats/Cri/ImageSPC.cs | 2 +- ArcFormats/Kid/ImageSPC.cs | 44 ++++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 ArcFormats/Kid/ImageSPC.cs diff --git a/ArcFormats/ArcFormats.csproj b/ArcFormats/ArcFormats.csproj index 39752fe1..0057045d 100644 --- a/ArcFormats/ArcFormats.csproj +++ b/ArcFormats/ArcFormats.csproj @@ -133,6 +133,7 @@ + diff --git a/ArcFormats/Cri/ImageSPC.cs b/ArcFormats/Cri/ImageSPC.cs index bd5da105..772aef31 100644 --- a/ArcFormats/Cri/ImageSPC.cs +++ b/ArcFormats/Cri/ImageSPC.cs @@ -33,7 +33,7 @@ namespace GameRes.Formats.Cri [Export(typeof(ImageFormat))] public class SpcFormat : XtxFormat { - public override string Tag { get { return "SPC"; } } + public override string Tag { get { return "SPC/Xbox360"; } } public override string Description { get { return "CRI MiddleWare compressed texture format"; } } public override uint Signature { get { return 0; } } diff --git a/ArcFormats/Kid/ImageSPC.cs b/ArcFormats/Kid/ImageSPC.cs new file mode 100644 index 00000000..30ccd141 --- /dev/null +++ b/ArcFormats/Kid/ImageSPC.cs @@ -0,0 +1,44 @@ +using GameRes.Compression; +using System.ComponentModel.Composition; +using System.IO; + +namespace GameRes.Formats.Kid +{ + [Export(typeof(ImageFormat))] + public class SpcFormat: LbgFormat + { + public override string Tag { get { return "SPC/PS2"; } } + public override string Description { get { return "PS2 CRI MiddleWare compressed texture format"; } } + public override uint Signature { get { return 0; } } + public SpcFormat() + { + Extensions = new string[] { "spc" }; + } + + public override ImageMetaData ReadMetaData(IBinaryStream stream) + { + uint unpacked_size = stream.Signature; + if (unpacked_size <= 0x20 || unpacked_size > 0x5000000) // ~83MB + return null; + stream.Position = 4; + using (var lzss = new LzssStream(stream.AsStream, LzssMode.Decompress, true)) + using (var input = new SeekableStream(lzss)) + using (var lbg = new BinaryStream(input, stream.Name)) + return base.ReadMetaData(lbg); + } + + public override ImageData Read(IBinaryStream stream, ImageMetaData info) + { + stream.Position = 4; + using (var lzss = new LzssStream(stream.AsStream, LzssMode.Decompress, true)) + using (var input = new SeekableStream(lzss)) + using (var lbg = new BinaryStream(input, stream.Name)) + return base.Read(lbg, info); + } + + public override void Write(Stream file, ImageData image) + { + throw new System.NotImplementedException("SpcFormat.Write not implemented"); + } + } +}