Files
GARbro-crskycode/ArcFormats/VnMaker/ImagePNG.cs

62 lines
2.0 KiB
C#

using System.ComponentModel.Composition;
using System.IO;
namespace GameRes.Formats.VnMaker
{
[Export(typeof(ImageFormat))]
public class PngFormat : GameRes.PngFormat
{
public override string Tag { get { return "PNG/VnMaker Encrypted PNG Image"; } }
public override string Description { get { return "VnMaker Encrypted PNG Image"; } }
public override uint Signature { get { return 0; } }
public override bool CanWrite { get { return true; } }
public PngFormat() : base()
{
Signatures = new uint[] { 0 };
Extensions = new[] { "png" };
}
public override ImageMetaData ReadMetaData (IBinaryStream file)
{
using (var input = DeobfuscateStream (file, GuessEncryptionKey (file)))
{
if (input.Signature != 0x474E5089)
throw new InvalidFormatException ();
return base.ReadMetaData (input);
}
}
public override ImageData Read (IBinaryStream file, ImageMetaData info)
{
using (var input = DeobfuscateStream (file, GuessEncryptionKey (file)))
{
if (input.Signature != 0x474E5089)
throw new InvalidFormatException ();
return base.Read (input, info);
}
}
byte[] GuessEncryptionKey (IBinaryStream file)
{
return new byte[] { 0x0A, 0x2B, 0x36, 0x6F, 0x0B };
}
IBinaryStream DeobfuscateStream (IBinaryStream file, byte[] key)
{
var png = new ByteStringEncryptedStream (file.AsStream, key, true);
return new BinaryStream (png, file.Name);
}
public override void Write (Stream file, ImageData image)
{
var ms = new MemoryStream ();
base.Write (ms, image);
ms.Position = 0;
var es = new ByteStringEncryptedStream (ms, GuessEncryptionKey (null));
es.CopyTo (file);
file.Flush ();
}
}
}