Fixes in ImageBank and FrameViewer

master
1987kostya 4 years ago
parent aa549a64e2
commit c949a63843

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

@ -11,8 +11,6 @@ namespace DotNetCTFDumper.GUI
{
public byte[] parsedData;
public byte[] rawData;
private ByteViewer _viewer;
public HexViewForm(byte[] parsedData, byte[] rawData,Color color)
{
@ -74,7 +72,7 @@ namespace DotNetCTFDumper.GUI
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 bool SaveImages = true;
public bool SaveImages = false;
public Dictionary<int, ImageItem> Images = new Dictionary<int, ImageItem>();
public uint NumberOfItems;
public bool PreloadOnly=true;
public ImageBank(ByteReader reader) : base(reader)
{
@ -45,6 +46,16 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Banks
Settings.DumpImages = cache;
}
public void Preload()
{
}
public void LoadByHandle(int handle)
{
Images[handle].Load();
}
public event MainForm.SaveHandler OnImageSaved;
@ -55,25 +66,26 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Banks
public override void Read()
{
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();
Console.WriteLine($"Found {NumberOfItems} images");
if (!Settings.DumpImages) return;
//if (!Settings.DumpImages) return;
for (int i = 0; i < NumberOfItems; i++)
{
if (MainForm.BreakImages)
{
MainForm.BreakImages = false;
break;
}
var item = new ImageItem(Reader);
item.Read();
Images.Add(item.Handle, item);
item.Read(!PreloadOnly);
tempImages.Add(item.Handle, item);
if (SaveImages) item.Save($"{Settings.ImagePath}\\" + item.Handle.ToString() + ".png");
OnImageSaved?.Invoke(i,(int) NumberOfItems);
@ -85,6 +97,10 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Banks
//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;
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()
{
Handle = Reader.ReadInt32() - 1;
Position = (int) Reader.Tell();
Load();
Preload();
}
public override void Print(bool ext)
@ -144,6 +168,24 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Banks
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()
{
_bitmap = null;
@ -255,6 +297,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Banks
{
get
{
if (_colorArray==null) Load();
if (_bitmap == null)
{
_bitmap = new Bitmap(_width, _height, PixelFormat.Format32bppArgb);

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

@ -28,7 +28,11 @@ namespace DotNetCTFDumper.Utils
{
if (Instance.GameData.GameChunks.GetChunk<ImageBank>() == null) return;
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) =>
{
form.SetImageElements(false);

Loading…
Cancel
Save