IBinaryStream migration - continued.

This commit is contained in:
morkt
2016-10-15 12:21:12 +04:00
parent 503b734645
commit d0c1d5da01
39 changed files with 529 additions and 574 deletions

View File

@@ -50,7 +50,7 @@ namespace GameRes.Formats.AliceSoft
0x5D, 0x91, 0xAE, 0x87, 0x4A, 0x56, 0x41, 0xCD, 0x83, 0xEC, 0x4C, 0x92, 0xB5, 0xCB, 0x16, 0x34
};
public override ImageMetaData ReadMetaData (Stream stream)
public override ImageMetaData ReadMetaData (IBinaryStream stream)
{
var header = new byte[0x18];
stream.Position = 0xC;
@@ -68,12 +68,12 @@ namespace GameRes.Formats.AliceSoft
};
}
public override ImageData Read (Stream stream, ImageMetaData info)
public override ImageData Read (IBinaryStream stream, ImageMetaData info)
{
var meta = (AjpMetaData)info;
int stride = (int)meta.Width * 4;
byte[] pixels;
using (var jpeg = DecryptStream (stream, meta.ImageOffset, meta.ImageSize))
using (var jpeg = DecryptStream (stream.AsStream, meta.ImageOffset, meta.ImageSize))
{
var decoder = new JpegBitmapDecoder (jpeg,
BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
@@ -84,7 +84,7 @@ namespace GameRes.Formats.AliceSoft
pixels = new byte[stride * (int)meta.Height];
bitmap.CopyPixels (pixels, stride, 0);
}
using (var mask = DecryptStream (stream, meta.AlphaOffset, meta.AlphaSize))
using (var mask = DecryptStream (stream.AsStream, meta.AlphaOffset, meta.AlphaSize))
{
var alpha = ReadMask (mask);
int src = 0;

View File

@@ -46,39 +46,36 @@ namespace GameRes.Formats.AliceSoft
public override string Description { get { return "AliceSoft System incremental image"; } }
public override uint Signature { get { return 0x20666364; } } // 'dcf '
public override ImageMetaData ReadMetaData (Stream stream)
public override ImageMetaData ReadMetaData (IBinaryStream stream)
{
using (var reader = new ArcView.Reader (stream))
stream.Seek (4, SeekOrigin.Current);
uint header_size = stream.ReadUInt32();
long data_pos = stream.Position + header_size;
if (stream.ReadInt32() != 1)
return null;
uint width = stream.ReadUInt32();
uint height = stream.ReadUInt32();
int bpp = stream.ReadInt32();
int name_length = stream.ReadInt32();
if (name_length <= 0)
return null;
int shift = (name_length % 7) + 1;
var name_bits = stream.ReadBytes (name_length);
for (int i = 0; i < name_length; ++i)
{
stream.Seek (4, SeekOrigin.Current);
uint header_size = reader.ReadUInt32();
long data_pos = stream.Position + header_size;
if (reader.ReadInt32() != 1)
return null;
uint width = reader.ReadUInt32();
uint height = reader.ReadUInt32();
int bpp = reader.ReadInt32();
int name_length = reader.ReadInt32();
if (name_length <= 0)
return null;
int shift = (name_length % 7) + 1;
var name_bits = reader.ReadBytes (name_length);
for (int i = 0; i < name_length; ++i)
{
name_bits[i] = Binary.RotByteL (name_bits[i], shift);
}
return new DcfMetaData
{
Width = width,
Height = height,
BPP = bpp,
BaseName = Encodings.cp932.GetString (name_bits),
DataOffset = data_pos,
};
name_bits[i] = Binary.RotByteL (name_bits[i], shift);
}
return new DcfMetaData
{
Width = width,
Height = height,
BPP = bpp,
BaseName = Encodings.cp932.GetString (name_bits),
DataOffset = data_pos,
};
}
public override ImageData Read (Stream stream, ImageMetaData info)
public override ImageData Read (IBinaryStream stream, ImageMetaData info)
{
using (var reader = new DcfReader (stream, (DcfMetaData)info))
{
@@ -93,9 +90,9 @@ namespace GameRes.Formats.AliceSoft
}
}
internal class DcfReader : IDisposable
internal sealed class DcfReader : IDisposable
{
BinaryReader m_input;
IBinaryStream m_input;
DcfMetaData m_info;
byte[] m_output;
byte[] m_mask = null;
@@ -111,9 +108,9 @@ namespace GameRes.Formats.AliceSoft
public PixelFormat Format { get; private set; }
public int Stride { get; private set; }
public DcfReader (Stream input, DcfMetaData info)
public DcfReader (IBinaryStream input, DcfMetaData info)
{
m_input = new ArcView.Reader (input);
m_input = input;
m_info = info;
}
@@ -122,7 +119,7 @@ namespace GameRes.Formats.AliceSoft
long next_pos = m_info.DataOffset;
for (;;)
{
m_input.BaseStream.Position = next_pos;
m_input.Position = next_pos;
uint id = m_input.ReadUInt32();
next_pos += 8 + m_input.ReadUInt32();
if (0x6C646664 == id) // 'dfdl'
@@ -131,22 +128,22 @@ namespace GameRes.Formats.AliceSoft
if (unpacked_size <= 0)
continue;
m_mask = new byte[unpacked_size];
using (var input = new ZLibStream (m_input.BaseStream, CompressionMode.Decompress, true))
using (var input = new ZLibStream (m_input.AsStream, CompressionMode.Decompress, true))
input.Read (m_mask, 0, unpacked_size);
}
else if (0x64676364 == id) // 'dcgd'
break;
}
long qnt_pos = m_input.BaseStream.Position;
long qnt_pos = m_input.Position;
if (m_input.ReadUInt32() != Qnt.Signature)
throw new InvalidFormatException();
m_input.BaseStream.Seek (-4, SeekOrigin.Current);
var qnt_info = Qnt.ReadMetaData (m_input.BaseStream) as QntMetaData;
m_input.Seek (-4, SeekOrigin.Current);
var qnt_info = Qnt.ReadMetaData (m_input) as QntMetaData;
if (null == qnt_info)
throw new InvalidFormatException();
m_input.BaseStream.Position = qnt_pos + 0x44;
var overlay = new QntFormat.Reader (m_input.BaseStream, qnt_info);
m_input.Position = qnt_pos + 0x44;
var overlay = new QntFormat.Reader (m_input, qnt_info);
overlay.Unpack();
m_overlay_bpp = overlay.BPP;
if (m_mask != null)
@@ -236,14 +233,8 @@ namespace GameRes.Formats.AliceSoft
}
#region IDisposable Members
bool _disposed = false;
public void Dispose ()
{
if (!_disposed)
{
m_input.Dispose();
_disposed = true;
}
}
#endregion
}