Fixes in ImageBank and FrameViewer

master
1987kostya 4 years ago
parent aa549a64e2
commit c949a63843

@ -25,7 +25,7 @@ namespace DotNetCTFDumper.GUI
InitializeComponent(); InitializeComponent();
this.Width = frame.Width; this.Width = frame.Width;
this.Height = frame.Height; this.Height = frame.Height;
this.BackColor = frame.Background; this.BackColor = Color.Black;
this.Text = "Frame Viewer: "+frame.Name; this.Text = "Frame Viewer: "+frame.Name;
images = imgs; images = imgs;
contextMenuStrip1.ItemClicked+= new ToolStripItemClickedEventHandler(MenuItemSelected); contextMenuStrip1.ItemClicked+= new ToolStripItemClickedEventHandler(MenuItemSelected);

@ -11,9 +11,7 @@ namespace DotNetCTFDumper.GUI
{ {
public byte[] parsedData; public byte[] parsedData;
public byte[] rawData; public byte[] rawData;
private ByteViewer _viewer;
public HexViewForm(byte[] parsedData, byte[] rawData,Color color) public HexViewForm(byte[] parsedData, byte[] rawData,Color color)
{ {
InitializeComponent(); InitializeComponent();
@ -74,7 +72,7 @@ namespace DotNetCTFDumper.GUI
private void hexBox1_Click(object sender, EventArgs e) private void hexBox1_Click(object sender, EventArgs e)
{ {
Console.WriteLine("Semen");
} }
} }

@ -12,9 +12,10 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Banks
{ {
public class ImageBank : ChunkLoader public class ImageBank : ChunkLoader
{ {
public bool SaveImages = true; public bool SaveImages = false;
public Dictionary<int, ImageItem> Images = new Dictionary<int, ImageItem>(); public Dictionary<int, ImageItem> Images = new Dictionary<int, ImageItem>();
public uint NumberOfItems; public uint NumberOfItems;
public bool PreloadOnly=true;
public ImageBank(ByteReader reader) : base(reader) public ImageBank(ByteReader reader) : base(reader)
{ {
@ -45,6 +46,16 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Banks
Settings.DumpImages = cache; Settings.DumpImages = cache;
} }
public void Preload()
{
}
public void LoadByHandle(int handle)
{
Images[handle].Load();
}
public event MainForm.SaveHandler OnImageSaved; public event MainForm.SaveHandler OnImageSaved;
@ -55,25 +66,26 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Banks
public override void Read() public override void Read()
{ {
if (!Settings.DoMFA) Reader.Seek(0); //Reset the reader to avoid bugs when dumping more than once if (!Settings.DoMFA) Reader.Seek(0); //Reset the reader to avoid bugs when dumping more than once
Images = new Dictionary<int, ImageItem>(); var tempImages = new Dictionary<int, ImageItem>();
NumberOfItems = Reader.ReadUInt32(); NumberOfItems = Reader.ReadUInt32();
Console.WriteLine($"Found {NumberOfItems} images"); Console.WriteLine($"Found {NumberOfItems} images");
if (!Settings.DumpImages) return; //if (!Settings.DumpImages) return;
for (int i = 0; i < NumberOfItems; i++) for (int i = 0; i < NumberOfItems; i++)
{ {
if (MainForm.BreakImages) if (MainForm.BreakImages)
{ {
MainForm.BreakImages = false;
break; break;
} }
var item = new ImageItem(Reader); var item = new ImageItem(Reader);
item.Read(); item.Read(!PreloadOnly);
Images.Add(item.Handle, item); tempImages.Add(item.Handle, item);
if (SaveImages) item.Save($"{Settings.ImagePath}\\" + item.Handle.ToString() + ".png"); if (SaveImages) item.Save($"{Settings.ImagePath}\\" + item.Handle.ToString() + ".png");
OnImageSaved?.Invoke(i,(int) NumberOfItems); OnImageSaved?.Invoke(i,(int) NumberOfItems);
@ -85,6 +97,10 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Banks
//images[item.handle] = item; //images[item.handle] = item;
} }
if (!MainForm.BreakImages) Images = tempImages;
MainForm.BreakImages = false;
Console.WriteLine("Len:"+Images.Keys.Count);
} }
} }
@ -128,11 +144,19 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Banks
public int Debug2 = 1; public int Debug2 = 1;
private Bitmap _bitmap; private Bitmap _bitmap;
public void Read(bool load)
{
Handle = Reader.ReadInt32() - 1;
Position = (int) Reader.Tell();
if (load) Load();
else Preload();
}
public override void Read() public override void Read()
{ {
Handle = Reader.ReadInt32() - 1; Handle = Reader.ReadInt32() - 1;
Position = (int) Reader.Tell(); Position = (int) Reader.Tell();
Load(); Preload();
} }
public override void Print(bool ext) public override void Print(bool ext)
@ -144,6 +168,24 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Banks
throw new NotImplementedException(); throw new NotImplementedException();
} }
public void Preload()
{
_bitmap = null;
Reader.Seek(Position);
ByteReader imageReader;
// imageReader = Debug ? Reader : Decompressor.DecompressAsReader(Reader, out var a);
imageReader = Debug ? Reader : Decompressor.DecompressAsReader(Reader, out var a);
long start = imageReader.Tell();
_checksum = imageReader.ReadInt32();
_references = imageReader.ReadInt32();
Size = (int) imageReader.ReadUInt32();
imageReader.Seek(start+Size);
}
public void Load() public void Load()
{ {
_bitmap = null; _bitmap = null;
@ -255,6 +297,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Banks
{ {
get get
{ {
if (_colorArray==null) Load();
if (_bitmap == null) if (_bitmap == null)
{ {
_bitmap = new Bitmap(_width, _height, PixelFormat.Format32bppArgb); _bitmap = new Bitmap(_width, _height, PixelFormat.Format32bppArgb);

@ -105,7 +105,14 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders
anims.AnimationDict.TryGetValue(0, anims.AnimationDict.TryGetValue(0,
out Animation anim); out Animation anim);
anim.DirectionDict.TryGetValue(0, out AnimationDirection direction); anim.DirectionDict.TryGetValue(0, out AnimationDirection direction);
var firstFrameHandle = direction.Frames[0];
var firstFrameHandle = direction.Frames[0];
if (images.Images[firstFrameHandle].Bitmap == null)
{
Console.WriteLine("Preloading "+firstFrameHandle);
images.LoadByHandle(firstFrameHandle);
}
bmp = images.Images[firstFrameHandle]; bmp = images.Images[firstFrameHandle];
} }

@ -28,7 +28,11 @@ namespace DotNetCTFDumper.Utils
{ {
if (Instance.GameData.GameChunks.GetChunk<ImageBank>() == null) return; if (Instance.GameData.GameChunks.GetChunk<ImageBank>() == null) return;
form.SetImageElements(true); form.SetImageElements(true);
worker.DoWork += (senderA, eA) => { Instance.GameData.GameChunks.GetChunk<ImageBank>().Read(load,save); }; worker.DoWork += (senderA, eA) =>
{
Instance.GameData.GameChunks.GetChunk<ImageBank>().PreloadOnly = false;
Instance.GameData.GameChunks.GetChunk<ImageBank>().Read(load,save);
};
worker.RunWorkerCompleted += (senderA, eA) => worker.RunWorkerCompleted += (senderA, eA) =>
{ {
form.SetImageElements(false); form.SetImageElements(false);

Loading…
Cancel
Save