From 0d0f5e6e5810ff2a71106ade3157d237d9d5a055 Mon Sep 17 00:00:00 2001 From: Sour Date: Sat, 16 Mar 2019 16:38:28 -0400 Subject: [PATCH] Debugger: Added palette viewer --- UI/Debugger/Config/DebuggerShortcutsConfig.cs | 14 +- UI/Debugger/DebugWindowManager.cs | 2 + .../PpuViewer/frmPaletteViewer.Designer.cs | 92 +++++++++++++ UI/Debugger/PpuViewer/frmPaletteViewer.cs | 107 +++++++++++++++ UI/Debugger/PpuViewer/frmPaletteViewer.resx | 123 ++++++++++++++++++ UI/Debugger/PpuViewer/frmTilemapViewer.cs | 32 +++-- UI/Debugger/frmDbgPreferences.cs | 5 +- UI/Forms/frmMain.Designer.cs | 59 ++++++--- UI/Forms/frmMain.cs | 8 +- UI/UI.csproj | 9 ++ 10 files changed, 410 insertions(+), 41 deletions(-) create mode 100644 UI/Debugger/PpuViewer/frmPaletteViewer.Designer.cs create mode 100644 UI/Debugger/PpuViewer/frmPaletteViewer.cs create mode 100644 UI/Debugger/PpuViewer/frmPaletteViewer.resx diff --git a/UI/Debugger/Config/DebuggerShortcutsConfig.cs b/UI/Debugger/Config/DebuggerShortcutsConfig.cs index 6279047..77a5e38 100644 --- a/UI/Debugger/Config/DebuggerShortcutsConfig.cs +++ b/UI/Debugger/Config/DebuggerShortcutsConfig.cs @@ -74,8 +74,6 @@ namespace Mesen.GUI.Config public XmlKeys OpenEventViewer = Keys.Control | Keys.E; [ShortcutName("Open Memory Tools")] public XmlKeys OpenMemoryTools = Keys.Control | Keys.M; - [ShortcutName("Open PPU Viewer")] - public XmlKeys OpenPpuViewer = Keys.Control | Keys.P; [ShortcutName("Open Performance Profiler")] public XmlKeys OpenProfiler = Keys.Control | Keys.Y; [ShortcutName("Open Script Window")] @@ -87,13 +85,13 @@ namespace Mesen.GUI.Config [ShortcutName("Open Watch Window")] public XmlKeys OpenWatchWindow = Keys.Control | Keys.W; - [ShortcutName("Open Nametabler Viewer (Compact)")] - public XmlKeys OpenNametableViewer = Keys.Control | Keys.D1; - [ShortcutName("Open CHR Viewer (Compact)")] - public XmlKeys OpenChrViewer = Keys.Control | Keys.D2; - [ShortcutName("Open Sprite Viewer (Compact)")] + [ShortcutName("Open Tilemap Viewer")] + public XmlKeys OpenTilemapViewer = Keys.Control | Keys.D1; + [ShortcutName("Open Tile Viewer")] + public XmlKeys OpenTileViewer = Keys.Control | Keys.D2; + [ShortcutName("Open Sprite Viewer")] public XmlKeys OpenSpriteViewer = Keys.Control | Keys.D3; - [ShortcutName("Open Palette Viewer (Compact)")] + [ShortcutName("Open Palette Viewer")] public XmlKeys OpenPaletteViewer = Keys.Control | Keys.D4; //Debugger window diff --git a/UI/Debugger/DebugWindowManager.cs b/UI/Debugger/DebugWindowManager.cs index f23429a..cc1689c 100644 --- a/UI/Debugger/DebugWindowManager.cs +++ b/UI/Debugger/DebugWindowManager.cs @@ -35,6 +35,7 @@ namespace Mesen.GUI.Debugger case DebugWindow.TraceLogger: frm = new frmTraceLogger(); frm.Icon = Properties.Resources.LogWindow; break; case DebugWindow.MemoryTools: frm = new frmMemoryTools(); frm.Icon = Properties.Resources.CheatCode; break; case DebugWindow.TilemapViewer: frm = new frmTilemapViewer(); frm.Icon = Properties.Resources.VideoOptions; break; + case DebugWindow.PaletteViewer: frm = new frmPaletteViewer(); frm.Icon = Properties.Resources.VideoFilter; break; case DebugWindow.EventViewer: frm = new frmEventViewer(); frm.Icon = Properties.Resources.NesEventViewer; break; } _openedWindows.Add(frm); @@ -119,6 +120,7 @@ namespace Mesen.GUI.Debugger MemoryTools, TraceLogger, TilemapViewer, + PaletteViewer, EventViewer } } diff --git a/UI/Debugger/PpuViewer/frmPaletteViewer.Designer.cs b/UI/Debugger/PpuViewer/frmPaletteViewer.Designer.cs new file mode 100644 index 0000000..b92daf7 --- /dev/null +++ b/UI/Debugger/PpuViewer/frmPaletteViewer.Designer.cs @@ -0,0 +1,92 @@ +namespace Mesen.GUI.Debugger +{ + partial class frmPaletteViewer + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if(disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.picPalette = new Mesen.GUI.Controls.ctrlMesenPictureBox(); + this.ctrlScanlineCycleSelect = new Mesen.GUI.Debugger.Controls.ctrlScanlineCycleSelect(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + ((System.ComponentModel.ISupportInitialize)(this.picPalette)).BeginInit(); + this.tableLayoutPanel1.SuspendLayout(); + this.SuspendLayout(); + // + // picPalette + // + this.picPalette.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; + this.picPalette.Location = new System.Drawing.Point(3, 3); + this.picPalette.MinimumSize = new System.Drawing.Size(256, 256); + this.picPalette.Name = "picPalette"; + this.picPalette.Size = new System.Drawing.Size(256, 256); + this.picPalette.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.picPalette.TabIndex = 0; + this.picPalette.TabStop = false; + // + // ctrlScanlineCycleSelect + // + this.ctrlScanlineCycleSelect.Dock = System.Windows.Forms.DockStyle.Bottom; + this.ctrlScanlineCycleSelect.Location = new System.Drawing.Point(0, 263); + this.ctrlScanlineCycleSelect.Name = "ctrlScanlineCycleSelect"; + this.ctrlScanlineCycleSelect.Size = new System.Drawing.Size(485, 28); + this.ctrlScanlineCycleSelect.TabIndex = 5; + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 2; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tableLayoutPanel1.Controls.Add(this.picPalette, 0, 0); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 2; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(485, 263); + this.tableLayoutPanel1.TabIndex = 7; + // + // frmPaletteViewer + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(485, 291); + this.Controls.Add(this.tableLayoutPanel1); + this.Controls.Add(this.ctrlScanlineCycleSelect); + this.Name = "frmPaletteViewer"; + this.Text = "Tilemap Viewer"; + ((System.ComponentModel.ISupportInitialize)(this.picPalette)).EndInit(); + this.tableLayoutPanel1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private GUI.Controls.ctrlMesenPictureBox picPalette; + private Controls.ctrlScanlineCycleSelect ctrlScanlineCycleSelect; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + } +} \ No newline at end of file diff --git a/UI/Debugger/PpuViewer/frmPaletteViewer.cs b/UI/Debugger/PpuViewer/frmPaletteViewer.cs new file mode 100644 index 0000000..4382652 --- /dev/null +++ b/UI/Debugger/PpuViewer/frmPaletteViewer.cs @@ -0,0 +1,107 @@ +using Mesen.GUI.Forms; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Imaging; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Mesen.GUI.Debugger +{ + public partial class frmPaletteViewer : BaseForm + { + private NotificationListener _notifListener; + private byte[] _cgRam; + private Bitmap _paletteImage; + + public frmPaletteViewer() + { + InitializeComponent(); + } + + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + if(DesignMode) { + return; + } + + _notifListener = new NotificationListener(); + _notifListener.OnNotification += OnNotificationReceived; + + _paletteImage = new Bitmap(256, 256, PixelFormat.Format32bppArgb); + picPalette.Image = _paletteImage; + + ctrlScanlineCycleSelect.Initialize(241, 0); + + RefreshData(); + RefreshViewer(); + } + + protected override void OnFormClosed(FormClosedEventArgs e) + { + base.OnFormClosed(e); + _notifListener?.Dispose(); + } + + private void OnNotificationReceived(NotificationEventArgs e) + { + switch(e.NotificationType) { + case ConsoleNotificationType.ViewerRefresh: + if(e.Parameter.ToInt32() == ctrlScanlineCycleSelect.ViewerId) { + RefreshData(); + this.BeginInvoke((Action)(() => { + this.RefreshViewer(); + })); + } + break; + } + } + + private void RefreshData() + { + _cgRam = DebugApi.GetMemoryState(SnesMemoryType.CGRam); + } + + private void RefreshViewer() + { + Func to8Bit = (int color) => { return (uint)((color << 3) + (color >> 2)); }; + Func toArgb = (int rgb555) => { + uint b = to8Bit(rgb555 >> 10); + uint g = to8Bit((rgb555 >> 5) & 0x1F); + uint r = to8Bit(rgb555 & 0x1F); + + return (0xFF000000 | (r << 16) | (g << 8) | b); + }; + + + UInt32[] argbPalette = new UInt32[256]; + for(int i = 0; i < 256; i++) { + argbPalette[i] = toArgb(_cgRam[i * 2] | _cgRam[i * 2 + 1] << 8); + } + + using(Graphics g = Graphics.FromImage(_paletteImage)) { + GCHandle handle = GCHandle.Alloc(argbPalette, GCHandleType.Pinned); + Bitmap source = new Bitmap(16, 16, 16 * 4, PixelFormat.Format32bppArgb, handle.AddrOfPinnedObject()); + try { + g.InterpolationMode = InterpolationMode.NearestNeighbor; + g.SmoothingMode = SmoothingMode.None; + g.PixelOffsetMode = PixelOffsetMode.Half; + + g.ScaleTransform(16, 16); + g.DrawImage(source, 0, 0); + } finally { + handle.Free(); + } + } + + picPalette.Invalidate(); + } + } +} diff --git a/UI/Debugger/PpuViewer/frmPaletteViewer.resx b/UI/Debugger/PpuViewer/frmPaletteViewer.resx new file mode 100644 index 0000000..8766f29 --- /dev/null +++ b/UI/Debugger/PpuViewer/frmPaletteViewer.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/UI/Debugger/PpuViewer/frmTilemapViewer.cs b/UI/Debugger/PpuViewer/frmTilemapViewer.cs index 9480b22..6b203aa 100644 --- a/UI/Debugger/PpuViewer/frmTilemapViewer.cs +++ b/UI/Debugger/PpuViewer/frmTilemapViewer.cs @@ -25,21 +25,27 @@ namespace Mesen.GUI.Debugger public frmTilemapViewer() { InitializeComponent(); + } - if(!this.DesignMode) { - _options.BgMode = 0; - - _notifListener = new NotificationListener(); - _notifListener.OnNotification += OnNotificationReceived; - - _tilemapImage = new Bitmap(512, 512, PixelFormat.Format32bppArgb); - picTilemap.Image = _tilemapImage; - - ctrlScanlineCycleSelect.Initialize(241, 0); - - RefreshData(); - RefreshViewer(); + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + if(DesignMode) { + return; } + + _options.BgMode = 0; + + _notifListener = new NotificationListener(); + _notifListener.OnNotification += OnNotificationReceived; + + _tilemapImage = new Bitmap(512, 512, PixelFormat.Format32bppArgb); + picTilemap.Image = _tilemapImage; + + ctrlScanlineCycleSelect.Initialize(241, 0); + + RefreshData(); + RefreshViewer(); } protected override void OnFormClosed(FormClosedEventArgs e) diff --git a/UI/Debugger/frmDbgPreferences.cs b/UI/Debugger/frmDbgPreferences.cs index c7d76b0..d83ea3c 100644 --- a/UI/Debugger/frmDbgPreferences.cs +++ b/UI/Debugger/frmDbgPreferences.cs @@ -48,14 +48,13 @@ namespace Mesen.GUI.Debugger GetMember(nameof(DebuggerShortcutsConfig.OpenEventViewer)), GetMember(nameof(DebuggerShortcutsConfig.OpenMemoryTools)), GetMember(nameof(DebuggerShortcutsConfig.OpenProfiler)), - GetMember(nameof(DebuggerShortcutsConfig.OpenPpuViewer)), GetMember(nameof(DebuggerShortcutsConfig.OpenScriptWindow)), GetMember(nameof(DebuggerShortcutsConfig.OpenTextHooker)), GetMember(nameof(DebuggerShortcutsConfig.OpenTraceLogger)), GetMember(nameof(DebuggerShortcutsConfig.OpenWatchWindow)), - GetMember(nameof(DebuggerShortcutsConfig.OpenNametableViewer)), - GetMember(nameof(DebuggerShortcutsConfig.OpenChrViewer)), + GetMember(nameof(DebuggerShortcutsConfig.OpenTilemapViewer)), + GetMember(nameof(DebuggerShortcutsConfig.OpenTileViewer)), GetMember(nameof(DebuggerShortcutsConfig.OpenSpriteViewer)), GetMember(nameof(DebuggerShortcutsConfig.OpenPaletteViewer)), }; diff --git a/UI/Forms/frmMain.Designer.cs b/UI/Forms/frmMain.Designer.cs index 468be74..8b5cbc5 100644 --- a/UI/Forms/frmMain.Designer.cs +++ b/UI/Forms/frmMain.Designer.cs @@ -135,6 +135,9 @@ this.mnuAbout = new System.Windows.Forms.ToolStripMenuItem(); this.pnlRenderer = new System.Windows.Forms.Panel(); this.ctrlRecentGames = new Mesen.GUI.Controls.ctrlRecentGames(); + this.mnuPaletteViewer = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem12 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItem22 = new System.Windows.Forms.ToolStripSeparator(); this.mnuMain.SuspendLayout(); this.pnlRenderer.SuspendLayout(); this.SuspendLayout(); @@ -245,7 +248,7 @@ this.mnuPause.Enabled = false; this.mnuPause.Image = global::Mesen.GUI.Properties.Resources.MediaPause; this.mnuPause.Name = "mnuPause"; - this.mnuPause.Size = new System.Drawing.Size(152, 22); + this.mnuPause.Size = new System.Drawing.Size(139, 22); this.mnuPause.Text = "Pause"; // // mnuReset @@ -253,7 +256,7 @@ this.mnuReset.Enabled = false; this.mnuReset.Image = global::Mesen.GUI.Properties.Resources.Refresh; this.mnuReset.Name = "mnuReset"; - this.mnuReset.Size = new System.Drawing.Size(152, 22); + this.mnuReset.Size = new System.Drawing.Size(139, 22); this.mnuReset.Text = "Reset"; // // mnuPowerCycle @@ -261,19 +264,19 @@ this.mnuPowerCycle.Enabled = false; this.mnuPowerCycle.Image = global::Mesen.GUI.Properties.Resources.PowerCycle; this.mnuPowerCycle.Name = "mnuPowerCycle"; - this.mnuPowerCycle.Size = new System.Drawing.Size(152, 22); + this.mnuPowerCycle.Size = new System.Drawing.Size(139, 22); this.mnuPowerCycle.Text = "Power Cycle"; // // toolStripMenuItem24 // this.toolStripMenuItem24.Name = "toolStripMenuItem24"; - this.toolStripMenuItem24.Size = new System.Drawing.Size(149, 6); + this.toolStripMenuItem24.Size = new System.Drawing.Size(136, 6); // // mnuPowerOff // this.mnuPowerOff.Image = global::Mesen.GUI.Properties.Resources.MediaStop; this.mnuPowerOff.Name = "mnuPowerOff"; - this.mnuPowerOff.Size = new System.Drawing.Size(152, 22); + this.mnuPowerOff.Size = new System.Drawing.Size(139, 22); this.mnuPowerOff.Text = "Power Off"; // // optionsToolStripMenuItem @@ -311,7 +314,7 @@ this.mnuShowFPS}); this.mnuEmulationSpeed.Image = global::Mesen.GUI.Properties.Resources.Speed; this.mnuEmulationSpeed.Name = "mnuEmulationSpeed"; - this.mnuEmulationSpeed.Size = new System.Drawing.Size(152, 22); + this.mnuEmulationSpeed.Size = new System.Drawing.Size(135, 22); this.mnuEmulationSpeed.Text = "Speed"; this.mnuEmulationSpeed.DropDownOpening += new System.EventHandler(this.mnuEmulationSpeed_DropDownOpening); // @@ -399,7 +402,7 @@ this.mnuFullscreen}); this.mnuVideoScale.Image = global::Mesen.GUI.Properties.Resources.Fullscreen; this.mnuVideoScale.Name = "mnuVideoScale"; - this.mnuVideoScale.Size = new System.Drawing.Size(152, 22); + this.mnuVideoScale.Size = new System.Drawing.Size(135, 22); this.mnuVideoScale.Text = "Video Size"; this.mnuVideoScale.DropDownOpening += new System.EventHandler(this.mnuVideoScale_DropDownOpening); // @@ -485,7 +488,7 @@ this.mnuBilinearInterpolation}); this.mnuVideoFilter.Image = global::Mesen.GUI.Properties.Resources.VideoFilter; this.mnuVideoFilter.Name = "mnuVideoFilter"; - this.mnuVideoFilter.Size = new System.Drawing.Size(152, 22); + this.mnuVideoFilter.Size = new System.Drawing.Size(135, 22); this.mnuVideoFilter.Text = "Video Filter"; this.mnuVideoFilter.DropDownOpening += new System.EventHandler(this.mnuVideoFilter_DropDownOpening); // @@ -672,7 +675,7 @@ this.mnuRegionPal}); this.mnuRegion.Image = global::Mesen.GUI.Properties.Resources.WebBrowser; this.mnuRegion.Name = "mnuRegion"; - this.mnuRegion.Size = new System.Drawing.Size(152, 22); + this.mnuRegion.Size = new System.Drawing.Size(135, 22); this.mnuRegion.Text = "Region"; this.mnuRegion.DropDownOpening += new System.EventHandler(this.mnuRegion_DropDownOpening); // @@ -702,13 +705,13 @@ // toolStripMenuItem4 // this.toolStripMenuItem4.Name = "toolStripMenuItem4"; - this.toolStripMenuItem4.Size = new System.Drawing.Size(149, 6); + this.toolStripMenuItem4.Size = new System.Drawing.Size(132, 6); // // mnuAudioConfig // this.mnuAudioConfig.Image = global::Mesen.GUI.Properties.Resources.Audio; this.mnuAudioConfig.Name = "mnuAudioConfig"; - this.mnuAudioConfig.Size = new System.Drawing.Size(152, 22); + this.mnuAudioConfig.Size = new System.Drawing.Size(135, 22); this.mnuAudioConfig.Text = "Audio"; this.mnuAudioConfig.Click += new System.EventHandler(this.mnuAudioConfig_Click); // @@ -716,7 +719,7 @@ // this.mnuInputConfig.Image = global::Mesen.GUI.Properties.Resources.Controller; this.mnuInputConfig.Name = "mnuInputConfig"; - this.mnuInputConfig.Size = new System.Drawing.Size(152, 22); + this.mnuInputConfig.Size = new System.Drawing.Size(135, 22); this.mnuInputConfig.Text = "Input"; this.mnuInputConfig.Click += new System.EventHandler(this.mnuInputConfig_Click); // @@ -724,7 +727,7 @@ // this.mnuVideoConfig.Image = global::Mesen.GUI.Properties.Resources.VideoOptions; this.mnuVideoConfig.Name = "mnuVideoConfig"; - this.mnuVideoConfig.Size = new System.Drawing.Size(152, 22); + this.mnuVideoConfig.Size = new System.Drawing.Size(135, 22); this.mnuVideoConfig.Text = "Video"; this.mnuVideoConfig.Click += new System.EventHandler(this.mnuVideoConfig_Click); // @@ -732,20 +735,20 @@ // this.mnuEmulationConfig.Image = global::Mesen.GUI.Properties.Resources.DipSwitches; this.mnuEmulationConfig.Name = "mnuEmulationConfig"; - this.mnuEmulationConfig.Size = new System.Drawing.Size(152, 22); + this.mnuEmulationConfig.Size = new System.Drawing.Size(135, 22); this.mnuEmulationConfig.Text = "Emulation"; this.mnuEmulationConfig.Click += new System.EventHandler(this.mnuEmulationConfig_Click); // // toolStripMenuItem3 // this.toolStripMenuItem3.Name = "toolStripMenuItem3"; - this.toolStripMenuItem3.Size = new System.Drawing.Size(149, 6); + this.toolStripMenuItem3.Size = new System.Drawing.Size(132, 6); // // mnuPreferences // this.mnuPreferences.Image = global::Mesen.GUI.Properties.Resources.Settings; this.mnuPreferences.Name = "mnuPreferences"; - this.mnuPreferences.Size = new System.Drawing.Size(152, 22); + this.mnuPreferences.Size = new System.Drawing.Size(135, 22); this.mnuPreferences.Text = "Preferences"; this.mnuPreferences.Click += new System.EventHandler(this.mnuPreferences_Click); // @@ -847,7 +850,10 @@ this.mnuDebugger, this.mnuMemoryTools, this.mnuTraceLogger, + this.toolStripMenuItem12, this.mnuTilemapViewer, + this.mnuPaletteViewer, + this.toolStripMenuItem22, this.mnuEventViewer}); this.debugToolStripMenuItem.Name = "debugToolStripMenuItem"; this.debugToolStripMenuItem.Size = new System.Drawing.Size(54, 20); @@ -959,6 +965,24 @@ this.ctrlRecentGames.TabIndex = 1; this.ctrlRecentGames.Visible = false; // + // mnuPaletteViewer + // + this.mnuPaletteViewer.Image = global::Mesen.GUI.Properties.Resources.VideoFilter; + this.mnuPaletteViewer.Name = "mnuPaletteViewer"; + this.mnuPaletteViewer.Size = new System.Drawing.Size(155, 22); + this.mnuPaletteViewer.Text = "Palette Viewer"; + this.mnuPaletteViewer.Click += new System.EventHandler(this.mnuPaletteViewer_Click); + // + // toolStripMenuItem12 + // + this.toolStripMenuItem12.Name = "toolStripMenuItem12"; + this.toolStripMenuItem12.Size = new System.Drawing.Size(152, 6); + // + // toolStripMenuItem22 + // + this.toolStripMenuItem22.Name = "toolStripMenuItem22"; + this.toolStripMenuItem22.Size = new System.Drawing.Size(152, 6); + // // frmMain // this.AllowDrop = true; @@ -1089,5 +1113,8 @@ private System.Windows.Forms.ToolStripMenuItem mnuSoundRecorder; private System.Windows.Forms.ToolStripMenuItem mnuWaveRecord; private System.Windows.Forms.ToolStripMenuItem mnuWaveStop; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem12; + private System.Windows.Forms.ToolStripMenuItem mnuPaletteViewer; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem22; } } \ No newline at end of file diff --git a/UI/Forms/frmMain.cs b/UI/Forms/frmMain.cs index e5838dd..b13106c 100644 --- a/UI/Forms/frmMain.cs +++ b/UI/Forms/frmMain.cs @@ -183,7 +183,8 @@ namespace Mesen.GUI.Forms mnuDebugger.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenDebugger)); mnuMemoryTools.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenMemoryTools)); mnuEventViewer.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenEventViewer)); - mnuTilemapViewer.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenPpuViewer)); + mnuTilemapViewer.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenTilemapViewer)); + mnuPaletteViewer.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenPaletteViewer)); mnuTraceLogger.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenTraceLogger)); mnuNoneFilter.Click += (s, e) => { _shortcuts.SetVideoFilter(VideoFilterType.None); }; @@ -291,6 +292,11 @@ namespace Mesen.GUI.Forms DebugWindowManager.OpenDebugWindow(DebugWindow.TilemapViewer); } + private void mnuPaletteViewer_Click(object sender, EventArgs e) + { + DebugWindowManager.OpenDebugWindow(DebugWindow.PaletteViewer); + } + private void mnuEventViewer_Click(object sender, EventArgs e) { DebugWindowManager.OpenDebugWindow(DebugWindow.EventViewer); diff --git a/UI/UI.csproj b/UI/UI.csproj index f189f1d..2ffb82a 100644 --- a/UI/UI.csproj +++ b/UI/UI.csproj @@ -420,6 +420,12 @@ ctrlScanlineCycleSelect.cs + + Form + + + frmPaletteViewer.cs + Form @@ -709,6 +715,9 @@ ctrlScanlineCycleSelect.cs + + frmPaletteViewer.cs + frmTilemapViewer.cs