diff --git a/BizHawk.MultiClient/RenderPanel.cs b/BizHawk.MultiClient/RenderPanel.cs
index 20710b3b4a..6e2ad50f37 100644
--- a/BizHawk.MultiClient/RenderPanel.cs
+++ b/BizHawk.MultiClient/RenderPanel.cs
@@ -12,97 +12,97 @@ using BizHawk.Core;
namespace BizHawk.MultiClient
{
- public class ImageTexture : IDisposable
- {
- public Device GraphicsDevice;
- public Texture Texture;
+ public class ImageTexture : IDisposable
+ {
+ public Device GraphicsDevice;
+ public Texture Texture;
- private int imageWidth;
- public int ImageWidth { get { return imageWidth; } }
+ private int imageWidth;
+ public int ImageWidth { get { return imageWidth; } }
- private int imageHeight;
- public int ImageHeight { get { return imageHeight; } }
+ private int imageHeight;
+ public int ImageHeight { get { return imageHeight; } }
- private int textureWidth;
- public int TextureWidth { get { return textureWidth; } }
+ private int textureWidth;
+ public int TextureWidth { get { return textureWidth; } }
- private int textureHeight;
- public int TextureHeight { get { return textureHeight; } }
+ private int textureHeight;
+ public int TextureHeight { get { return textureHeight; } }
- public ImageTexture(Device graphicsDevice)
- {
- GraphicsDevice = graphicsDevice;
- }
+ public ImageTexture(Device graphicsDevice)
+ {
+ GraphicsDevice = graphicsDevice;
+ }
- public void SetImage(int[] data, int width, int height)
- {
- bool needsRecreating = false;
- if (Texture == null)
- {
- needsRecreating = true;
- }
- else
- {
- var currentTextureSize = Texture.GetLevelDescription(0);
- if (imageWidth != width || imageHeight != height)
- {
- needsRecreating = true;
- }
- }
- // If we need to recreate the texture, do so.
- if (needsRecreating)
- {
- if (Texture != null)
- {
- Texture.Dispose();
- Texture = null;
- }
- // Copy the width/height to member fields.
- imageWidth = width;
- imageHeight = height;
- // Round up the width/height to the nearest power of two.
- textureWidth = 32; textureHeight = 32;
- while (textureWidth < imageWidth) textureWidth <<= 1;
- while (textureHeight < imageHeight) textureHeight <<= 1;
- // Create a new texture instance.
- Texture = new Texture(GraphicsDevice, textureWidth, textureHeight, 1, Usage.Dynamic, Format.X8R8G8B8, Pool.Default);
- }
- // Copy the image data to the texture.
- using (var Data = Texture.LockRectangle(0, new Rectangle(0, 0, imageWidth, imageHeight), LockFlags.None).Data)
- {
- if (imageWidth == textureWidth)
- {
- // Widths are the same, just dump the data across (easy!)
- Data.WriteRange(data, 0, imageWidth * imageHeight);
- }
- else
- {
- // Widths are different, need a bit of additional magic here to make them fit:
- long RowSeekOffset = 4 * (textureWidth - imageWidth);
- for (int r = 0, s = 0; r < imageHeight; ++r, s += imageWidth)
- {
- Data.WriteRange(data, s, imageWidth);
- Data.Seek(RowSeekOffset, SeekOrigin.Current);
- }
- }
- Texture.UnlockRectangle(0);
- }
- }
+ public void SetImage(int[] data, int width, int height)
+ {
+ bool needsRecreating = false;
+ if (Texture == null)
+ {
+ needsRecreating = true;
+ }
+ else
+ {
+ var currentTextureSize = Texture.GetLevelDescription(0);
+ if (imageWidth != width || imageHeight != height)
+ {
+ needsRecreating = true;
+ }
+ }
+ // If we need to recreate the texture, do so.
+ if (needsRecreating)
+ {
+ if (Texture != null)
+ {
+ Texture.Dispose();
+ Texture = null;
+ }
+ // Copy the width/height to member fields.
+ imageWidth = width;
+ imageHeight = height;
+ // Round up the width/height to the nearest power of two.
+ textureWidth = 32; textureHeight = 32;
+ while (textureWidth < imageWidth) textureWidth <<= 1;
+ while (textureHeight < imageHeight) textureHeight <<= 1;
+ // Create a new texture instance.
+ Texture = new Texture(GraphicsDevice, textureWidth, textureHeight, 1, Usage.Dynamic, Format.X8R8G8B8, Pool.Default);
+ }
+ // Copy the image data to the texture.
+ using (var Data = Texture.LockRectangle(0, new Rectangle(0, 0, imageWidth, imageHeight), LockFlags.None).Data)
+ {
+ if (imageWidth == textureWidth)
+ {
+ // Widths are the same, just dump the data across (easy!)
+ Data.WriteRange(data, 0, imageWidth * imageHeight);
+ }
+ else
+ {
+ // Widths are different, need a bit of additional magic here to make them fit:
+ long RowSeekOffset = 4 * (textureWidth - imageWidth);
+ for (int r = 0, s = 0; r < imageHeight; ++r, s += imageWidth)
+ {
+ Data.WriteRange(data, s, imageWidth);
+ Data.Seek(RowSeekOffset, SeekOrigin.Current);
+ }
+ }
+ Texture.UnlockRectangle(0);
+ }
+ }
- private bool disposed;
+ private bool disposed;
- public void Dispose()
- {
- if (!disposed)
- {
- disposed = true;
- if (Texture != null)
- Texture.Dispose();
- Texture = null;
- GC.SuppressFinalize(this);
- }
- }
- }
+ public void Dispose()
+ {
+ if (!disposed)
+ {
+ disposed = true;
+ if (Texture != null)
+ Texture.Dispose();
+ Texture = null;
+ GC.SuppressFinalize(this);
+ }
+ }
+ }
public interface IRenderer : IDisposable
{
@@ -119,8 +119,8 @@ namespace BizHawk.MultiClient
public string FPS { get; set; }
public void Render(IVideoProvider video)
{
- Color BackgroundColor = Color.FromArgb(video.BackgroundColor);
- int[] data = video.GetVideoBuffer();
+ Color BackgroundColor = Color.FromArgb(video.BackgroundColor);
+ int[] data = video.GetVideoBuffer();
Bitmap bmp = new Bitmap(video.BufferWidth, video.BufferHeight, PixelFormat.Format32bppArgb);
BitmapData bmpdata = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
@@ -142,287 +142,287 @@ namespace BizHawk.MultiClient
public class Direct3DRenderPanel : IRenderer
- {
- public Color BackgroundColor { get; set; }
- public bool Resized { get; set; }
+ {
+ public Color BackgroundColor { get; set; }
+ public bool Resized { get; set; }
public string FPS { get; set; }
- private Direct3D d3d;
- private Device Device;
- private Control backingControl;
- public ImageTexture Texture;
- private Sprite Sprite;
- private Font MessageFont;
- private Font AlertFont;
+ private Direct3D d3d;
+ private Device Device;
+ private Control backingControl;
+ public ImageTexture Texture;
+ private Sprite Sprite;
+ private Font MessageFont;
+ private Font AlertFont;
public Direct3DRenderPanel(Direct3D direct3D, Control control)
- {
- d3d = direct3D;
- backingControl = control;
- control.DoubleClick += (o, e) => Global.MainForm.ToggleFullscreen();
- }
+ {
+ d3d = direct3D;
+ backingControl = control;
+ control.DoubleClick += (o, e) => Global.MainForm.ToggleFullscreen();
+ }
- private void DestroyDevice()
- {
- if (Texture != null)
- {
- Texture.Dispose();
- Texture = null;
- }
- if (Sprite != null)
- {
- Sprite.Dispose();
- Sprite = null;
- }
- if (MessageFont != null)
- {
- MessageFont.Dispose();
- MessageFont = null;
- }
- if (Device != null)
- {
- Device.Dispose();
- Device = null;
- }
- }
+ private void DestroyDevice()
+ {
+ if (Texture != null)
+ {
+ Texture.Dispose();
+ Texture = null;
+ }
+ if (Sprite != null)
+ {
+ Sprite.Dispose();
+ Sprite = null;
+ }
+ if (MessageFont != null)
+ {
+ MessageFont.Dispose();
+ MessageFont = null;
+ }
+ if (Device != null)
+ {
+ Device.Dispose();
+ Device = null;
+ }
+ }
- public void CreateDevice()
- {
- DestroyDevice();
+ public void CreateDevice()
+ {
+ DestroyDevice();
var pp = new PresentParameters
- {
- BackBufferWidth = Math.Max(1, backingControl.ClientSize.Width),
- BackBufferHeight = Math.Max(1, backingControl.ClientSize.Height),
- DeviceWindowHandle = backingControl.Handle,
- PresentationInterval = Global.Config.DisplayVSync?PresentInterval.One:PresentInterval.Immediate
- };
- Device = new Device(d3d, 0, DeviceType.Hardware, backingControl.Handle, CreateFlags.HardwareVertexProcessing, pp);
- Sprite = new Sprite(Device);
- Texture = new ImageTexture(Device);
- MessageFont = new Font(Device, 16, 0, FontWeight.Bold, 1, false, CharacterSet.Default, Precision.Default, FontQuality.Default, PitchAndFamily.Default | PitchAndFamily.DontCare, "Courier");
- AlertFont = new Font(Device, 20, 0, FontWeight.ExtraBold, 1, true, CharacterSet.Default, Precision.Default, FontQuality.Default, PitchAndFamily.Default | PitchAndFamily.DontCare, "Courier");
- }
+ {
+ BackBufferWidth = Math.Max(1, backingControl.ClientSize.Width),
+ BackBufferHeight = Math.Max(1, backingControl.ClientSize.Height),
+ DeviceWindowHandle = backingControl.Handle,
+ PresentationInterval = Global.Config.DisplayVSync ? PresentInterval.One : PresentInterval.Immediate
+ };
+ Device = new Device(d3d, 0, DeviceType.Hardware, backingControl.Handle, CreateFlags.HardwareVertexProcessing, pp);
+ Sprite = new Sprite(Device);
+ Texture = new ImageTexture(Device);
+ MessageFont = new Font(Device, 16, 0, FontWeight.Bold, 1, false, CharacterSet.Default, Precision.Default, FontQuality.Default, PitchAndFamily.Default | PitchAndFamily.DontCare, "Courier");
+ AlertFont = new Font(Device, 20, 0, FontWeight.ExtraBold, 1, true, CharacterSet.Default, Precision.Default, FontQuality.Default, PitchAndFamily.Default | PitchAndFamily.DontCare, "Courier");
+ }
- public void Render()
- {
- if (Device == null || Resized)
- CreateDevice();
+ public void Render()
+ {
+ if (Device == null || Resized)
+ CreateDevice();
- Resized = false;
- Device.Clear(ClearFlags.Target, BackgroundColor, 1.0f, 0);
- Device.Present(Present.DoNotWait);
- }
+ Resized = false;
+ Device.Clear(ClearFlags.Target, BackgroundColor, 1.0f, 0);
+ Device.Present(Present.DoNotWait);
+ }
- public void Render(IVideoProvider video)
- {
- if (video == null)
- {
- Render();
- return;
- }
+ public void Render(IVideoProvider video)
+ {
+ if (video == null)
+ {
+ Render();
+ return;
+ }
- if (Device == null || Resized)
- CreateDevice();
- Resized = false;
+ if (Device == null || Resized)
+ CreateDevice();
+ Resized = false;
- BackgroundColor = Color.FromArgb(video.BackgroundColor);
+ BackgroundColor = Color.FromArgb(video.BackgroundColor);
- int[] data = video.GetVideoBuffer();
- Texture.SetImage(data, video.BufferWidth, video.BufferHeight);
+ int[] data = video.GetVideoBuffer();
+ Texture.SetImage(data, video.BufferWidth, video.BufferHeight);
- Device.Clear(ClearFlags.Target, BackgroundColor, 1.0f, 0);
+ Device.Clear(ClearFlags.Target, BackgroundColor, 1.0f, 0);
- // figure out scaling factor
- float widthScale = (float) backingControl.Size.Width / video.BufferWidth;
- float heightScale = (float) backingControl.Size.Height / video.BufferHeight;
- float finalScale = Math.Min(widthScale, heightScale);
+ // figure out scaling factor
+ float widthScale = (float)backingControl.Size.Width / video.BufferWidth;
+ float heightScale = (float)backingControl.Size.Height / video.BufferHeight;
+ float finalScale = Math.Min(widthScale, heightScale);
- Device.BeginScene();
+ Device.BeginScene();
- Sprite.Begin(SpriteFlags.None);
- Device.SetSamplerState(0, SamplerState.MagFilter, TextureFilter.Point);
- Device.SetSamplerState(1, SamplerState.MagFilter, TextureFilter.Point);
- Sprite.Transform = Matrix.Scaling(finalScale, finalScale, 0f);
- Sprite.Draw(Texture.Texture, new Rectangle(0, 0, video.BufferWidth, video.BufferHeight), new Vector3(video.BufferWidth / 2f, video.BufferHeight / 2f, 0), new Vector3(backingControl.Size.Width / 2f / finalScale, backingControl.Size.Height / 2f / finalScale, 0), Color.White);
- Sprite.End();
+ Sprite.Begin(SpriteFlags.None);
+ Device.SetSamplerState(0, SamplerState.MagFilter, TextureFilter.Point);
+ Device.SetSamplerState(1, SamplerState.MagFilter, TextureFilter.Point);
+ Sprite.Transform = Matrix.Scaling(finalScale, finalScale, 0f);
+ Sprite.Draw(Texture.Texture, new Rectangle(0, 0, video.BufferWidth, video.BufferHeight), new Vector3(video.BufferWidth / 2f, video.BufferHeight / 2f, 0), new Vector3(backingControl.Size.Width / 2f / finalScale, backingControl.Size.Height / 2f / finalScale, 0), Color.White);
+ Sprite.End();
- DrawMessages();
+ DrawMessages();
- Device.EndScene();
- Device.Present(Present.DoNotWait);
- }
+ Device.EndScene();
+ Device.Present(Present.DoNotWait);
+ }
- ///
- /// Display all screen info objects like fps, frame counter, lag counter, and input display
- ///
- public void DrawScreenInfo()
- {
- //TODO: If movie loaded use that frame counter, and also display total movie frame count if read-only
- if (Global.Config.DisplayFrameCounter)
- {
- MessageFont.DrawString(null, MakeFrameCounter(), Global.Config.DispFrameCx+1,
- Global.Config.DispFrameCy+1, new Color4(Color.Black));
- MessageFont.DrawString(null, MakeFrameCounter(), Global.Config.DispFrameCx,
- Global.Config.DispFrameCy, Color.FromArgb(Global.Config.MessagesColor));
- }
- if (Global.Config.DisplayInput)
- {
- string input = MakeLastInputDisplay();
- Color c;
- if (Global.MainForm.UserMovie.GetMovieMode() == MOVIEMODE.PLAY)
- {
- c = Color.Gray;
- }
- else
- c = Color.FromArgb(Global.Config.MessagesColor);
-
- MessageFont.DrawString(null, input, Global.Config.DispInpx+2, Global.Config.DispInpy+2, new Color4(Color.Black));
- MessageFont.DrawString(null, input, Global.Config.DispInpx+1, Global.Config.DispInpy+1, Color.FromArgb(Global.Config.LastInputColor));
- input = MakeInputDisplay();
- MessageFont.DrawString(null, input, Global.Config.DispInpx, Global.Config.DispInpy, c);
- }
+ ///
+ /// Display all screen info objects like fps, frame counter, lag counter, and input display
+ ///
+ public void DrawScreenInfo()
+ {
+ //TODO: If movie loaded use that frame counter, and also display total movie frame count if read-only
+ if (Global.Config.DisplayFrameCounter)
+ {
+ MessageFont.DrawString(null, MakeFrameCounter(), Global.Config.DispFrameCx + 1,
+ Global.Config.DispFrameCy + 1, new Color4(Color.Black));
+ MessageFont.DrawString(null, MakeFrameCounter(), Global.Config.DispFrameCx,
+ Global.Config.DispFrameCy, Color.FromArgb(Global.Config.MessagesColor));
+ }
+ if (Global.Config.DisplayInput)
+ {
+ string input = MakeLastInputDisplay();
+ Color c;
+ if (Global.MainForm.UserMovie.GetMovieMode() == MOVIEMODE.PLAY)
+ {
+ c = Color.Gray;
+ }
+ else
+ c = Color.FromArgb(Global.Config.MessagesColor);
- if (Global.Config.DisplayFPS)
- {
- MessageFont.DrawString(null, FPS, Global.Config.DispFPSx + 1,
- Global.Config.DispFPSy+1, new Color4(Color.Black));
- MessageFont.DrawString(null, FPS, Global.Config.DispFPSx,
- Global.Config.DispFPSy, Color.FromArgb(Global.Config.MessagesColor));
- }
+ MessageFont.DrawString(null, input, Global.Config.DispInpx + 2, Global.Config.DispInpy + 2, new Color4(Color.Black));
+ MessageFont.DrawString(null, input, Global.Config.DispInpx + 1, Global.Config.DispInpy + 1, Color.FromArgb(Global.Config.LastInputColor));
+ input = MakeInputDisplay();
+ MessageFont.DrawString(null, input, Global.Config.DispInpx, Global.Config.DispInpy, c);
+ }
- if (Global.Config.DisplayLagCounter)
- {
- if (Global.Emulator.IsLagFrame)
- {
- AlertFont.DrawString(null, MakeLagCounter(), Global.Config.DispLagx + 1,
- Global.Config.DispLagy + 1, new Color4(Color.Black));
- AlertFont.DrawString(null, MakeLagCounter(), Global.Config.DispLagx,
- Global.Config.DispLagy, Color.FromArgb(Global.Config.AlertMessageColor));
- }
- else
- {
- MessageFont.DrawString(null, MakeLagCounter(), Global.Config.DispLagx + 1,
- Global.Config.DispLagy + 1, new Color4(Color.Black));
- MessageFont.DrawString(null, MakeLagCounter(), Global.Config.DispLagx,
- Global.Config.DispLagy, Color.FromArgb(Global.Config.MessagesColor));
- }
-
- }
- if (Global.Config.DisplayRerecordCount)
- {
- MessageFont.DrawString(null, MakeRerecordCount(), Global.Config.DispRecx + 1,
- Global.Config.DispRecy + 1, new Color4(Color.Black));
- MessageFont.DrawString(null, MakeRerecordCount(), Global.Config.DispRecx,
- Global.Config.DispRecy, Color.FromArgb(Global.Config.MessagesColor));
- }
-
- //TODO: clean this up or replace with simple draw symbols
- if (Global.MainForm.UserMovie.GetMovieMode() == MOVIEMODE.PLAY
- || Global.MainForm.UserMovie.GetMovieMode() == MOVIEMODE.PLAY)
- {
- MessageFont.DrawString(null, "Playback", 208 + 1,
- 0 + 1, new Color4(Color.Black));
- MessageFont.DrawString(null, "Playback", 208,
- 0, new Color4(Color.Red));
- }
- else if (Global.MainForm.UserMovie.GetMovieMode() == MOVIEMODE.RECORD)
- {
- AlertFont.DrawString(null, "Recording", 208 + 1,
- 0 + 1, new Color4(Color.Black));
- AlertFont.DrawString(null, "Recording", 208,
- 0, new Color4(Color.Red));
- }
- }
+ if (Global.Config.DisplayFPS)
+ {
+ MessageFont.DrawString(null, FPS, Global.Config.DispFPSx + 1,
+ Global.Config.DispFPSy + 1, new Color4(Color.Black));
+ MessageFont.DrawString(null, FPS, Global.Config.DispFPSx,
+ Global.Config.DispFPSy, Color.FromArgb(Global.Config.MessagesColor));
+ }
- private string MakeFrameCounter()
- {
- //TODO: remove rerecord count code and make it its own display option
- if (Global.MainForm.UserMovie.GetMovieMode() == MOVIEMODE.FINISHED)
- {
- return Global.Emulator.Frame.ToString() + "/" + Global.MainForm.UserMovie.GetMovieLength().ToString() + " (Finished)";
- }
- else if (Global.MainForm.UserMovie.GetMovieMode() == MOVIEMODE.PLAY)
- {
- return "E" + Global.Emulator.Frame.ToString() + " " + Global.MainForm.UserMovie.lastLog.ToString()
- + "/" + Global.MainForm.UserMovie.GetMovieLength().ToString();
- }
- else if (Global.MainForm.UserMovie.GetMovieMode() == MOVIEMODE.RECORD)
- return "E" + Global.Emulator.Frame.ToString() + " " + Global.MainForm.UserMovie.lastLog.ToString() +
- " length: " + Global.MainForm.UserMovie.GetMovieLength().ToString();
- else
- {
- return Global.Emulator.Frame.ToString();
- }
- }
+ if (Global.Config.DisplayLagCounter)
+ {
+ if (Global.Emulator.IsLagFrame)
+ {
+ AlertFont.DrawString(null, MakeLagCounter(), Global.Config.DispLagx + 1,
+ Global.Config.DispLagy + 1, new Color4(Color.Black));
+ AlertFont.DrawString(null, MakeLagCounter(), Global.Config.DispLagx,
+ Global.Config.DispLagy, Color.FromArgb(Global.Config.AlertMessageColor));
+ }
+ else
+ {
+ MessageFont.DrawString(null, MakeLagCounter(), Global.Config.DispLagx + 1,
+ Global.Config.DispLagy + 1, new Color4(Color.Black));
+ MessageFont.DrawString(null, MakeLagCounter(), Global.Config.DispLagx,
+ Global.Config.DispLagy, Color.FromArgb(Global.Config.MessagesColor));
+ }
- private string MakeLagCounter()
- {
- return Global.Emulator.LagCount.ToString();
- }
+ }
+ if (Global.Config.DisplayRerecordCount)
+ {
+ MessageFont.DrawString(null, MakeRerecordCount(), Global.Config.DispRecx + 1,
+ Global.Config.DispRecy + 1, new Color4(Color.Black));
+ MessageFont.DrawString(null, MakeRerecordCount(), Global.Config.DispRecx,
+ Global.Config.DispRecy, Color.FromArgb(Global.Config.MessagesColor));
+ }
- private List messages = new List(5);
+ //TODO: clean this up or replace with simple draw symbols
+ if (Global.MainForm.UserMovie.GetMovieMode() == MOVIEMODE.PLAY
+ || Global.MainForm.UserMovie.GetMovieMode() == MOVIEMODE.PLAY)
+ {
+ MessageFont.DrawString(null, "Playback", 208 + 1,
+ 0 + 1, new Color4(Color.Black));
+ MessageFont.DrawString(null, "Playback", 208,
+ 0, new Color4(Color.Red));
+ }
+ else if (Global.MainForm.UserMovie.GetMovieMode() == MOVIEMODE.RECORD)
+ {
+ AlertFont.DrawString(null, "Recording", 208 + 1,
+ 0 + 1, new Color4(Color.Black));
+ AlertFont.DrawString(null, "Recording", 208,
+ 0, new Color4(Color.Red));
+ }
+ }
- public void AddMessage(string message)
- {
- messages.Add(new UIMessage {Message = message, ExpireAt = DateTime.Now + TimeSpan.FromSeconds(2)});
- }
+ private string MakeFrameCounter()
+ {
+ //TODO: remove rerecord count code and make it its own display option
+ if (Global.MainForm.UserMovie.GetMovieMode() == MOVIEMODE.FINISHED)
+ {
+ return Global.Emulator.Frame.ToString() + "/" + Global.MainForm.UserMovie.GetMovieLength().ToString() + " (Finished)";
+ }
+ else if (Global.MainForm.UserMovie.GetMovieMode() == MOVIEMODE.PLAY)
+ {
+ return "E" + Global.Emulator.Frame.ToString() + " " + Global.MainForm.UserMovie.lastLog.ToString()
+ + "/" + Global.MainForm.UserMovie.GetMovieLength().ToString();
+ }
+ else if (Global.MainForm.UserMovie.GetMovieMode() == MOVIEMODE.RECORD)
+ return "E" + Global.Emulator.Frame.ToString() + " " + Global.MainForm.UserMovie.lastLog.ToString() +
+ " length: " + Global.MainForm.UserMovie.GetMovieLength().ToString();
+ else
+ {
+ return Global.Emulator.Frame.ToString();
+ }
+ }
- private void DrawMessages()
- {
- messages.RemoveAll(m => DateTime.Now > m.ExpireAt);
- DrawScreenInfo();
- int line = 1;
- for (int i=messages.Count - 1; i>=0; i--, line++)
- {
- int x = 3;
- int y = backingControl.Size.Height - (line*18);
- MessageFont.DrawString(null, messages[i].Message, x+2, y+2, new Color4(Color.Black));
- MessageFont.DrawString(null, messages[i].Message, x, y, Color.FromArgb(Global.Config.MessagesColor));
- }
- }
+ private string MakeLagCounter()
+ {
+ return Global.Emulator.LagCount.ToString();
+ }
- private bool disposed;
+ private List messages = new List(5);
- public void Dispose()
- {
- if (disposed == false)
- {
- disposed = true;
- DestroyDevice();
- }
- }
+ public void AddMessage(string message)
+ {
+ messages.Add(new UIMessage { Message = message, ExpireAt = DateTime.Now + TimeSpan.FromSeconds(2) });
+ }
- public string MakeInputDisplay()
- {
- string tmp = Global.ActiveController.GetControllersAsMnemonic();
- tmp = tmp.Replace(".", " ");
- tmp = tmp.Replace("|", "");
- return tmp;
- }
+ private void DrawMessages()
+ {
+ messages.RemoveAll(m => DateTime.Now > m.ExpireAt);
+ DrawScreenInfo();
+ int line = 1;
+ for (int i = messages.Count - 1; i >= 0; i--, line++)
+ {
+ int x = 3;
+ int y = backingControl.Size.Height - (line * 18);
+ MessageFont.DrawString(null, messages[i].Message, x + 2, y + 2, new Color4(Color.Black));
+ MessageFont.DrawString(null, messages[i].Message, x, y, Color.FromArgb(Global.Config.MessagesColor));
+ }
+ }
- public string MakeLastInputDisplay()
- {
- string tmp = Global.MainForm.wasPressed;
- tmp = tmp.Replace(".", " ");
- tmp = tmp.Replace("|", "");
- return tmp;
- }
+ private bool disposed;
- public string MakeRerecordCount()
- {
- string tmp = "";
- if (Global.MainForm.UserMovie.GetMovieMode() != MOVIEMODE.INACTIVE)
- {
- tmp += "Rerecord Count: ";
- tmp += Global.MainForm.GetActiveMovie().GetRerecordCount().ToString();
- }
- return tmp;
- }
- }
+ public void Dispose()
+ {
+ if (disposed == false)
+ {
+ disposed = true;
+ DestroyDevice();
+ }
+ }
- class UIMessage
- {
- public string Message;
- public DateTime ExpireAt;
- }
+ public string MakeInputDisplay()
+ {
+ string tmp = Global.ActiveController.GetControllersAsMnemonic();
+ tmp = tmp.Replace(".", " ");
+ tmp = tmp.Replace("|", "");
+ return tmp;
+ }
+
+ public string MakeLastInputDisplay()
+ {
+ string tmp = Global.MainForm.wasPressed;
+ tmp = tmp.Replace(".", " ");
+ tmp = tmp.Replace("|", "");
+ return tmp;
+ }
+
+ public string MakeRerecordCount()
+ {
+ string tmp = "";
+ if (Global.MainForm.UserMovie.GetMovieMode() != MOVIEMODE.INACTIVE)
+ {
+ tmp += "Rerecord Count: ";
+ tmp += Global.MainForm.GetActiveMovie().GetRerecordCount().ToString();
+ }
+ return tmp;
+ }
+ }
+
+ class UIMessage
+ {
+ public string Message;
+ public DateTime ExpireAt;
+ }
}
\ No newline at end of file
diff --git a/BizHawk.MultiClient/Rewind.cs b/BizHawk.MultiClient/Rewind.cs
index 785ef4bcb7..9998c72063 100644
--- a/BizHawk.MultiClient/Rewind.cs
+++ b/BizHawk.MultiClient/Rewind.cs
@@ -2,173 +2,173 @@
namespace BizHawk.MultiClient
{
- public partial class MainForm
- {
- private MruStack RewindBuf = new MruStack(15000);
- private byte[] LastState;
+ public partial class MainForm
+ {
+ private MruStack RewindBuf = new MruStack(15000);
+ private byte[] LastState;
- private void CaptureRewindState()
- {
- if (LastState == null)
- {
- // This is the first frame. Capture the state, and put it in LastState for future deltas to be compared against.
- LastState = Global.Emulator.SaveStateBinary();
- //System.Console.WriteLine(LastState.Length);
- return;
- }
+ private void CaptureRewindState()
+ {
+ if (LastState == null)
+ {
+ // This is the first frame. Capture the state, and put it in LastState for future deltas to be compared against.
+ LastState = Global.Emulator.SaveStateBinary();
+ //System.Console.WriteLine(LastState.Length);
+ return;
+ }
- // Otherwise, it's not the first frame, so build a delta.
- if (LastState.Length <= 0x10000)
- CaptureRewindState64K();
- else
- CaptureRewindStateLarge();
- }
+ // Otherwise, it's not the first frame, so build a delta.
+ if (LastState.Length <= 0x10000)
+ CaptureRewindState64K();
+ else
+ CaptureRewindStateLarge();
+ }
- ///
- /// Builds a delta for states that are <= 64K in size.
- ///
- private void CaptureRewindState64K()
- {
- byte[] CurrentState = Global.Emulator.SaveStateBinary();
- int beginChangeSequence = -1;
- bool inChangeSequence = false;
- var ms = new MemoryStream();
- var writer = new BinaryWriter(ms);
- for (int i = 0; i < CurrentState.Length; i++)
- {
- if (inChangeSequence == false)
- {
+ ///
+ /// Builds a delta for states that are <= 64K in size.
+ ///
+ private void CaptureRewindState64K()
+ {
+ byte[] CurrentState = Global.Emulator.SaveStateBinary();
+ int beginChangeSequence = -1;
+ bool inChangeSequence = false;
+ var ms = new MemoryStream();
+ var writer = new BinaryWriter(ms);
+ for (int i = 0; i < CurrentState.Length; i++)
+ {
+ if (inChangeSequence == false)
+ {
if (i >= LastState.Length)
continue;
- if (CurrentState[i] == LastState[i])
- continue;
+ if (CurrentState[i] == LastState[i])
+ continue;
- inChangeSequence = true;
- beginChangeSequence = i;
- continue;
- }
+ inChangeSequence = true;
+ beginChangeSequence = i;
+ continue;
+ }
- if (i - beginChangeSequence == 254 || i == CurrentState.Length - 1)
- {
- writer.Write((byte)(i - beginChangeSequence + 1));
- writer.Write((ushort)beginChangeSequence);
- writer.Write(LastState, beginChangeSequence, i - beginChangeSequence + 1);
- inChangeSequence = false;
- continue;
- }
+ if (i - beginChangeSequence == 254 || i == CurrentState.Length - 1)
+ {
+ writer.Write((byte)(i - beginChangeSequence + 1));
+ writer.Write((ushort)beginChangeSequence);
+ writer.Write(LastState, beginChangeSequence, i - beginChangeSequence + 1);
+ inChangeSequence = false;
+ continue;
+ }
- if (CurrentState[i] == LastState[i])
- {
- writer.Write((byte)(i - beginChangeSequence));
- writer.Write((ushort)beginChangeSequence);
- writer.Write(LastState, beginChangeSequence, i - beginChangeSequence);
- inChangeSequence = false;
- }
- }
- LastState = CurrentState;
- ms.Position = 0;
- RewindBuf.Push(ms);
- }
+ if (CurrentState[i] == LastState[i])
+ {
+ writer.Write((byte)(i - beginChangeSequence));
+ writer.Write((ushort)beginChangeSequence);
+ writer.Write(LastState, beginChangeSequence, i - beginChangeSequence);
+ inChangeSequence = false;
+ }
+ }
+ LastState = CurrentState;
+ ms.Position = 0;
+ RewindBuf.Push(ms);
+ }
- ///
- /// Builds a delta for states that are > 64K in size.
- ///
- private void CaptureRewindStateLarge()
- {
- byte[] CurrentState = Global.Emulator.SaveStateBinary();
- int beginChangeSequence = -1;
- bool inChangeSequence = false;
- var ms = new MemoryStream();
- var writer = new BinaryWriter(ms);
- for (int i = 0; i < CurrentState.Length; i++)
- {
- if (inChangeSequence == false)
- {
+ ///
+ /// Builds a delta for states that are > 64K in size.
+ ///
+ private void CaptureRewindStateLarge()
+ {
+ byte[] CurrentState = Global.Emulator.SaveStateBinary();
+ int beginChangeSequence = -1;
+ bool inChangeSequence = false;
+ var ms = new MemoryStream();
+ var writer = new BinaryWriter(ms);
+ for (int i = 0; i < CurrentState.Length; i++)
+ {
+ if (inChangeSequence == false)
+ {
if (i >= LastState.Length)
continue;
- if (CurrentState[i] == LastState[i])
- continue;
+ if (CurrentState[i] == LastState[i])
+ continue;
- inChangeSequence = true;
- beginChangeSequence = i;
- continue;
- }
+ inChangeSequence = true;
+ beginChangeSequence = i;
+ continue;
+ }
- if (i - beginChangeSequence == 254 || i == CurrentState.Length - 1)
- {
- writer.Write((byte)(i - beginChangeSequence + 1));
- writer.Write(beginChangeSequence);
- writer.Write(LastState, beginChangeSequence, i - beginChangeSequence + 1);
- inChangeSequence = false;
- continue;
- }
+ if (i - beginChangeSequence == 254 || i == CurrentState.Length - 1)
+ {
+ writer.Write((byte)(i - beginChangeSequence + 1));
+ writer.Write(beginChangeSequence);
+ writer.Write(LastState, beginChangeSequence, i - beginChangeSequence + 1);
+ inChangeSequence = false;
+ continue;
+ }
- if (CurrentState[i] == LastState[i])
- {
- writer.Write((byte)(i - beginChangeSequence));
- writer.Write(beginChangeSequence);
- writer.Write(LastState, beginChangeSequence, i - beginChangeSequence);
- inChangeSequence = false;
- }
- }
- LastState = CurrentState;
- ms.Position = 0;
- RewindBuf.Push(ms);
- }
+ if (CurrentState[i] == LastState[i])
+ {
+ writer.Write((byte)(i - beginChangeSequence));
+ writer.Write(beginChangeSequence);
+ writer.Write(LastState, beginChangeSequence, i - beginChangeSequence);
+ inChangeSequence = false;
+ }
+ }
+ LastState = CurrentState;
+ ms.Position = 0;
+ RewindBuf.Push(ms);
+ }
- private void Rewind64K()
- {
- var ms = RewindBuf.Pop();
- var reader = new BinaryReader(ms);
- var output = new MemoryStream(LastState);
- while (ms.Position < ms.Length - 1)
- {
- byte len = reader.ReadByte();
- ushort offset = reader.ReadUInt16();
- output.Position = offset;
- output.Write(ms.GetBuffer(), (int)ms.Position, len);
- ms.Position += len;
- }
- reader.Close();
- output.Position = 0;
- Global.Emulator.LoadStateBinary(new BinaryReader(output));
- }
+ private void Rewind64K()
+ {
+ var ms = RewindBuf.Pop();
+ var reader = new BinaryReader(ms);
+ var output = new MemoryStream(LastState);
+ while (ms.Position < ms.Length - 1)
+ {
+ byte len = reader.ReadByte();
+ ushort offset = reader.ReadUInt16();
+ output.Position = offset;
+ output.Write(ms.GetBuffer(), (int)ms.Position, len);
+ ms.Position += len;
+ }
+ reader.Close();
+ output.Position = 0;
+ Global.Emulator.LoadStateBinary(new BinaryReader(output));
+ }
- private void RewindLarge()
- {
- var ms = RewindBuf.Pop();
- var reader = new BinaryReader(ms);
- var output = new MemoryStream(LastState);
- while (ms.Position < ms.Length - 1)
- {
- byte len = reader.ReadByte();
- int offset = reader.ReadInt32();
- output.Position = offset;
- output.Write(ms.GetBuffer(), (int)ms.Position, len);
- ms.Position += len;
- }
- reader.Close();
- output.Position = 0;
- Global.Emulator.LoadStateBinary(new BinaryReader(output));
- }
+ private void RewindLarge()
+ {
+ var ms = RewindBuf.Pop();
+ var reader = new BinaryReader(ms);
+ var output = new MemoryStream(LastState);
+ while (ms.Position < ms.Length - 1)
+ {
+ byte len = reader.ReadByte();
+ int offset = reader.ReadInt32();
+ output.Position = offset;
+ output.Write(ms.GetBuffer(), (int)ms.Position, len);
+ ms.Position += len;
+ }
+ reader.Close();
+ output.Position = 0;
+ Global.Emulator.LoadStateBinary(new BinaryReader(output));
+ }
- private void Rewind(int frames)
- {
- for (int i = 0; i < frames; i++)
- {
- if (RewindBuf.Count == 0)
- return;
- if (LastState.Length < 0x10000)
- Rewind64K();
- else
- RewindLarge();
- }
- }
+ public void Rewind(int frames)
+ {
+ for (int i = 0; i < frames; i++)
+ {
+ if (RewindBuf.Count == 0)
+ return;
+ if (LastState.Length < 0x10000)
+ Rewind64K();
+ else
+ RewindLarge();
+ }
+ }
- public void ResetRewindBuffer()
- {
- RewindBuf.Clear();
- LastState = null;
- }
- }
+ public void ResetRewindBuffer()
+ {
+ RewindBuf.Clear();
+ LastState = null;
+ }
+ }
}
diff --git a/BizHawk.MultiClient/config/SoundConfig.cs b/BizHawk.MultiClient/config/SoundConfig.cs
index ab4b5f6251..4dc2be2edd 100644
--- a/BizHawk.MultiClient/config/SoundConfig.cs
+++ b/BizHawk.MultiClient/config/SoundConfig.cs
@@ -9,65 +9,65 @@ using System.Windows.Forms;
namespace BizHawk.MultiClient
{
- public partial class SoundConfig : Form
- {
- public SoundConfig()
- {
- InitializeComponent();
- }
+ public partial class SoundConfig : Form
+ {
+ public SoundConfig()
+ {
+ InitializeComponent();
+ }
- private void SoundConfig_Load(object sender, EventArgs e)
- {
- SoundOnCheckBox.Checked = Global.Config.SoundEnabled;
- MuteFrameAdvance.Checked = Global.Config.MuteFrameAdvance;
- SoundVolBar.Value = Global.Config.SoundVolume;
- SoundVolNumeric.Value = Global.Config.SoundVolume;
- UpdateSoundDialog();
- }
+ private void SoundConfig_Load(object sender, EventArgs e)
+ {
+ SoundOnCheckBox.Checked = Global.Config.SoundEnabled;
+ MuteFrameAdvance.Checked = Global.Config.MuteFrameAdvance;
+ SoundVolBar.Value = Global.Config.SoundVolume;
+ SoundVolNumeric.Value = Global.Config.SoundVolume;
+ UpdateSoundDialog();
+ }
- private void OK_Click(object sender, EventArgs e)
- {
- Global.Config.SoundEnabled = SoundOnCheckBox.Checked;
- Global.Config.MuteFrameAdvance = MuteFrameAdvance.Checked;
- Global.Config.SoundVolume = SoundVolBar.Value;
- Global.Sound.ChangeVolume(Global.Config.SoundVolume);
- Global.Sound.UpdateSoundSettings();
- Global.Sound.StartSound();
- this.Close();
- }
+ private void OK_Click(object sender, EventArgs e)
+ {
+ Global.Config.SoundEnabled = SoundOnCheckBox.Checked;
+ Global.Config.MuteFrameAdvance = MuteFrameAdvance.Checked;
+ Global.Config.SoundVolume = SoundVolBar.Value;
+ Global.Sound.ChangeVolume(Global.Config.SoundVolume);
+ Global.Sound.UpdateSoundSettings();
+ Global.Sound.StartSound();
+ this.Close();
+ }
- private void Cancel_Click(object sender, EventArgs e)
- {
- this.Close();
- }
+ private void Cancel_Click(object sender, EventArgs e)
+ {
+ this.Close();
+ }
- private void trackBar1_Scroll(object sender, EventArgs e)
- {
- SoundVolNumeric.Value = SoundVolBar.Value;
- }
+ private void trackBar1_Scroll(object sender, EventArgs e)
+ {
+ SoundVolNumeric.Value = SoundVolBar.Value;
+ }
- private void SoundVolNumeric_ValueChanged(object sender, EventArgs e)
- {
- SoundVolBar.Value = (int)SoundVolNumeric.Value;
- }
+ private void SoundVolNumeric_ValueChanged(object sender, EventArgs e)
+ {
+ SoundVolBar.Value = (int)SoundVolNumeric.Value;
+ }
- private void SoundOnCheckBox_CheckedChanged(object sender, EventArgs e)
- {
- UpdateSoundDialog();
- }
+ private void SoundOnCheckBox_CheckedChanged(object sender, EventArgs e)
+ {
+ UpdateSoundDialog();
+ }
- private void UpdateSoundDialog()
- {
- if (SoundOnCheckBox.Checked)
- {
- SoundVolGroup.Enabled = true;
- MuteFrameAdvance.Enabled = true;
- }
- else
- {
- SoundVolGroup.Enabled = false;
- MuteFrameAdvance.Enabled = false;
- }
- }
- }
+ private void UpdateSoundDialog()
+ {
+ if (SoundOnCheckBox.Checked)
+ {
+ SoundVolGroup.Enabled = true;
+ MuteFrameAdvance.Enabled = true;
+ }
+ else
+ {
+ SoundVolGroup.Enabled = false;
+ MuteFrameAdvance.Enabled = false;
+ }
+ }
+ }
}
diff --git a/BizHawk.MultiClient/tools/TAStudio.Designer.cs b/BizHawk.MultiClient/tools/TAStudio.Designer.cs
index e9dc414fe3..6ff9922f39 100644
--- a/BizHawk.MultiClient/tools/TAStudio.Designer.cs
+++ b/BizHawk.MultiClient/tools/TAStudio.Designer.cs
@@ -66,11 +66,16 @@
this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();
this.ReadOnlyCheckBox = new System.Windows.Forms.CheckBox();
this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
+ this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.insertFrameToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();
+ this.selectAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.menuStrip1.SuspendLayout();
this.toolStripContainer1.TopToolStripPanel.SuspendLayout();
this.toolStripContainer1.SuspendLayout();
this.toolStrip1.SuspendLayout();
this.toolStrip2.SuspendLayout();
+ this.contextMenuStrip1.SuspendLayout();
this.SuspendLayout();
//
// menuStrip1
@@ -81,7 +86,7 @@
this.settingsToolStripMenuItem});
this.menuStrip1.Location = new System.Drawing.Point(0, 0);
this.menuStrip1.Name = "menuStrip1";
- this.menuStrip1.Size = new System.Drawing.Size(699, 24);
+ this.menuStrip1.Size = new System.Drawing.Size(721, 24);
this.menuStrip1.TabIndex = 0;
this.menuStrip1.Text = "menuStrip1";
//
@@ -237,7 +242,7 @@
this.TASView.Location = new System.Drawing.Point(22, 38);
this.TASView.Name = "TASView";
this.TASView.selectedItem = -1;
- this.TASView.Size = new System.Drawing.Size(399, 424);
+ this.TASView.Size = new System.Drawing.Size(335, 424);
this.TASView.TabIndex = 1;
this.TASView.UseCompatibleStateImageBehavior = false;
this.TASView.View = System.Windows.Forms.View.Details;
@@ -256,10 +261,10 @@
//
// toolStripContainer1.ContentPanel
//
- this.toolStripContainer1.ContentPanel.Size = new System.Drawing.Size(172, 125);
- this.toolStripContainer1.Location = new System.Drawing.Point(427, 38);
+ this.toolStripContainer1.ContentPanel.Size = new System.Drawing.Size(172, 39);
+ this.toolStripContainer1.Location = new System.Drawing.Point(373, 38);
this.toolStripContainer1.Name = "toolStripContainer1";
- this.toolStripContainer1.Size = new System.Drawing.Size(172, 175);
+ this.toolStripContainer1.Size = new System.Drawing.Size(172, 89);
this.toolStripContainer1.TabIndex = 2;
this.toolStripContainer1.Text = "toolStripContainer1";
//
@@ -380,7 +385,7 @@
this.ReadOnlyCheckBox.BackColor = System.Drawing.SystemColors.Control;
this.ReadOnlyCheckBox.Image = global::BizHawk.MultiClient.Properties.Resources.ReadOnly;
this.ReadOnlyCheckBox.ImageAlign = System.Drawing.ContentAlignment.BottomRight;
- this.ReadOnlyCheckBox.Location = new System.Drawing.Point(605, 38);
+ this.ReadOnlyCheckBox.Location = new System.Drawing.Point(551, 38);
this.ReadOnlyCheckBox.Name = "ReadOnlyCheckBox";
this.ReadOnlyCheckBox.Size = new System.Drawing.Size(22, 22);
this.ReadOnlyCheckBox.TabIndex = 3;
@@ -388,11 +393,37 @@
this.ReadOnlyCheckBox.UseVisualStyleBackColor = false;
this.ReadOnlyCheckBox.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);
//
+ // contextMenuStrip1
+ //
+ this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.insertFrameToolStripMenuItem1,
+ this.toolStripSeparator5,
+ this.selectAllToolStripMenuItem});
+ this.contextMenuStrip1.Name = "contextMenuStrip1";
+ this.contextMenuStrip1.Size = new System.Drawing.Size(148, 54);
+ //
+ // insertFrameToolStripMenuItem1
+ //
+ this.insertFrameToolStripMenuItem1.Name = "insertFrameToolStripMenuItem1";
+ this.insertFrameToolStripMenuItem1.Size = new System.Drawing.Size(147, 22);
+ this.insertFrameToolStripMenuItem1.Text = "Insert Frame";
+ //
+ // toolStripSeparator5
+ //
+ this.toolStripSeparator5.Name = "toolStripSeparator5";
+ this.toolStripSeparator5.Size = new System.Drawing.Size(144, 6);
+ //
+ // selectAllToolStripMenuItem
+ //
+ this.selectAllToolStripMenuItem.Name = "selectAllToolStripMenuItem";
+ this.selectAllToolStripMenuItem.Size = new System.Drawing.Size(147, 22);
+ this.selectAllToolStripMenuItem.Text = "Select All";
+ //
// TAStudio
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(699, 474);
+ this.ClientSize = new System.Drawing.Size(721, 474);
this.Controls.Add(this.ReadOnlyCheckBox);
this.Controls.Add(this.toolStripContainer1);
this.Controls.Add(this.TASView);
@@ -412,6 +443,7 @@
this.toolStrip1.PerformLayout();
this.toolStrip2.ResumeLayout(false);
this.toolStrip2.PerformLayout();
+ this.contextMenuStrip1.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
@@ -455,5 +487,9 @@
private System.Windows.Forms.ToolStripButton FastFowardToEnd;
private System.Windows.Forms.ToolStripButton PlayMovieFromBeginning;
private System.Windows.Forms.ToolStripMenuItem insertFrameToolStripMenuItem;
+ private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
+ private System.Windows.Forms.ToolStripMenuItem insertFrameToolStripMenuItem1;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator5;
+ private System.Windows.Forms.ToolStripMenuItem selectAllToolStripMenuItem;
}
}
\ No newline at end of file
diff --git a/BizHawk.MultiClient/tools/TAStudio.cs b/BizHawk.MultiClient/tools/TAStudio.cs
index c99d73a270..c48ffe929d 100644
--- a/BizHawk.MultiClient/tools/TAStudio.cs
+++ b/BizHawk.MultiClient/tools/TAStudio.cs
@@ -128,12 +128,12 @@ namespace BizHawk.MultiClient
if (ReadOnlyCheckBox.Checked)
{
ReadOnlyCheckBox.BackColor = System.Drawing.SystemColors.Control;
- //TODO: set tooltip text to "In Read-Only Mode)
+ toolTip1.SetToolTip(this.ReadOnlyCheckBox, "Currently Read-Only Mode");
}
else
{
ReadOnlyCheckBox.BackColor = Color.LightCoral;
- //TOD: set tooltip text to "In Read+Write Mode"
+ toolTip1.SetToolTip(this.ReadOnlyCheckBox, "Currently Read+Write Mode");
}
}
@@ -144,7 +144,8 @@ namespace BizHawk.MultiClient
private void RewindToBeginning_Click(object sender, EventArgs e)
{
-
+ Global.MainForm.Rewind(Global.Emulator.Frame);
+ DisplayList();
}
private void FastForwardToEnd_Click(object sender, EventArgs e)
diff --git a/BizHawk.MultiClient/tools/TAStudio.resx b/BizHawk.MultiClient/tools/TAStudio.resx
index 1b68ea45e8..58e7d0174f 100644
--- a/BizHawk.MultiClient/tools/TAStudio.resx
+++ b/BizHawk.MultiClient/tools/TAStudio.resx
@@ -145,6 +145,12 @@
324, 17
+
+ 324, 17
+
+
+ 416, 17
+
AAABAAEAEBAAAAAAAABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAAAAAAA