mirror of
https://github.com/crskycode/GARbro.git
synced 2026-07-08 01:30:18 +08:00
Initial commit.
This commit is contained in:
100
GameRes/Image.cs
Normal file
100
GameRes/Image.cs
Normal file
@@ -0,0 +1,100 @@
|
||||
//! \file Image.cs
|
||||
//! \date Tue Jul 01 11:29:52 2014
|
||||
//! \brief image class.
|
||||
//
|
||||
|
||||
using System.IO;
|
||||
using System.Windows.Media.Imaging;
|
||||
|
||||
namespace GameRes
|
||||
{
|
||||
public class ImageMetaData
|
||||
{
|
||||
public uint Width { get; set; }
|
||||
public uint Height { get; set; }
|
||||
public int OffsetX { get; set; }
|
||||
public int OffsetY { get; set; }
|
||||
public int BPP { get; set; }
|
||||
}
|
||||
|
||||
public class ImageEntry : Entry
|
||||
{
|
||||
public override string Type { get { return "image"; } }
|
||||
/*
|
||||
public ImageEntry ()
|
||||
{
|
||||
Type = "image";
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
public class ImageData
|
||||
{
|
||||
private BitmapSource m_bitmap;
|
||||
|
||||
public BitmapSource Bitmap { get { return m_bitmap; } }
|
||||
public uint Width { get { return (uint)m_bitmap.PixelWidth; } }
|
||||
public uint Height { get { return (uint)m_bitmap.PixelHeight; } }
|
||||
public int OffsetX { get; set; }
|
||||
public int OffsetY { get; set; }
|
||||
public int BPP { get { return m_bitmap.Format.BitsPerPixel; } }
|
||||
|
||||
public ImageData (BitmapSource data, ImageMetaData meta)
|
||||
{
|
||||
m_bitmap = data;
|
||||
OffsetX = meta.OffsetX;
|
||||
OffsetY = meta.OffsetY;
|
||||
}
|
||||
|
||||
public ImageData (BitmapSource data, int x = 0, int y = 0)
|
||||
{
|
||||
m_bitmap = data;
|
||||
OffsetX = x;
|
||||
OffsetY = y;
|
||||
}
|
||||
}
|
||||
|
||||
public abstract class ImageFormat : IResource
|
||||
{
|
||||
public override string Type { get { return "image"; } }
|
||||
|
||||
public ImageData Read (Stream file)
|
||||
{
|
||||
bool need_dispose = false;
|
||||
try
|
||||
{
|
||||
if (!file.CanSeek)
|
||||
{
|
||||
var stream = new MemoryStream();
|
||||
file.CopyTo (stream);
|
||||
file = stream;
|
||||
need_dispose = true;
|
||||
}
|
||||
var info = ReadMetaData (file);
|
||||
if (null == info)
|
||||
throw new InvalidFormatException();
|
||||
return Read (file, info);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (need_dispose)
|
||||
file.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
public abstract ImageData Read (Stream file, ImageMetaData info);
|
||||
public abstract void Write (Stream file, ImageData bitmap);
|
||||
|
||||
public abstract ImageMetaData ReadMetaData (Stream file);
|
||||
|
||||
public override Entry CreateEntry ()
|
||||
{
|
||||
return new ImageEntry();
|
||||
}
|
||||
|
||||
public bool IsBuiltin
|
||||
{
|
||||
get { return this.GetType().Assembly == typeof(ImageFormat).Assembly; }
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user