private void SaveStateFile(string filename, string name) { var core = Emulator.AsStatable(); using (var bs = new BinaryStateSaver(filename)) { if (Global.Config.SaveStateType == Config.SaveStateTypeE.Text || (Global.Config.SaveStateType == Config.SaveStateTypeE.Default && !core.BinarySaveStatesPreferred)) { // text savestate format using (new SimpleTime("Save Core")) bs.PutLump(BinaryStateLump.CorestateText, (tw) => core.SaveStateText(tw)); } else { // binary core lump format using (new SimpleTime("Save Core")) bs.PutLump(BinaryStateLump.Corestate, bw => core.SaveStateBinary(bw)); } if (true) //Global.Config.SaveScreenshotWithStates) { var vp = Emulator.VideoProvider(); var buff = vp.GetVideoBuffer(); int out_w = vp.BufferWidth; int out_h = vp.BufferHeight; // if buffer is too big, scale down screenshot if (true /* !Global.Config.NoLowResLargeScreenshotWithStates*/ && buff.Length >= Global.Config.BigScreenshotSize) { out_w /= 2; out_h /= 2; } using (new SimpleTime("Save Framebuffer")) bs.PutLump(BinaryStateLump.Framebuffer, (s) => QuickBmpFile.Save(Emulator.VideoProvider(), s, out_w, out_h)); } if (IAmMaster) { if (Global.MovieSession.Movie.IsActive) { bs.PutLump(BinaryStateLump.Input, delegate(TextWriter tw) { // this never should have been a core's responsibility tw.WriteLine("Frame {0}", Emulator.Frame); Global.MovieSession.HandleMovieSaveState(tw); }); } } } }
public void PopulateFramebuffer(BinaryReader br) { try { using (new SimpleTime("Load Framebuffer")) QuickBmpFile.Load(Emulator.VideoProvider(), br.BaseStream); } catch { var buff = Emulator.VideoProvider().GetVideoBuffer(); try { for (int i = 0; i < buff.Length; i++) { int j = br.ReadInt32(); buff[i] = j; } } catch (EndOfStreamException) { } } }