diff --git a/UI/Debugger/Controls/ctrlPanel.cs b/UI/Debugger/Controls/ctrlPanel.cs
new file mode 100644
index 0000000..674a1c5
--- /dev/null
+++ b/UI/Debugger/Controls/ctrlPanel.cs
@@ -0,0 +1,41 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace Mesen.GUI.Debugger.Controls
+{
+ public class ctrlPanel : Panel
+ {
+ public delegate void ZoomEventHandler(int scaleDelta);
+ public event ZoomEventHandler OnZoom;
+
+ public ctrlPanel()
+ {
+ this.DoubleBuffered = true;
+ }
+
+ protected override void OnMouseWheel(MouseEventArgs e)
+ {
+ if(Control.ModifierKeys != Keys.Control) {
+ int hori = this.HorizontalScroll.Value;
+ int vert = this.VerticalScroll.Value;
+
+ if(Control.ModifierKeys == Keys.Shift) {
+ hori = Math.Max(0, Math.Min(hori - e.Delta, this.HorizontalScroll.Maximum));
+ } else {
+ vert = Math.Max(0, Math.Min(vert - e.Delta, this.VerticalScroll.Maximum));
+ }
+
+ this.HorizontalScroll.Value = hori;
+ this.HorizontalScroll.Value = hori;
+ this.VerticalScroll.Value = vert;
+ this.VerticalScroll.Value = vert;
+ } else {
+ this.OnZoom?.Invoke(e.Delta > 0 ? 1 : -1);
+ }
+ }
+ }
+}
diff --git a/UI/Debugger/PpuViewer/ctrlImagePanel.Designer.cs b/UI/Debugger/PpuViewer/ctrlImagePanel.Designer.cs
new file mode 100644
index 0000000..38b0889
--- /dev/null
+++ b/UI/Debugger/PpuViewer/ctrlImagePanel.Designer.cs
@@ -0,0 +1,73 @@
+namespace Mesen.GUI.Debugger.PpuViewer
+{
+ partial class ctrlImagePanel
+ {
+ ///
+ /// 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 Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.ctrlPanel = new Mesen.GUI.Debugger.Controls.ctrlPanel();
+ this.ctrlImageViewer = new Mesen.GUI.Debugger.PpuViewer.ctrlImageViewer();
+ this.ctrlPanel.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // ctrlPanel
+ //
+ this.ctrlPanel.AutoScroll = true;
+ this.ctrlPanel.Controls.Add(this.ctrlImageViewer);
+ this.ctrlPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.ctrlPanel.Location = new System.Drawing.Point(0, 0);
+ this.ctrlPanel.Name = "ctrlPanel";
+ this.ctrlPanel.Size = new System.Drawing.Size(327, 326);
+ this.ctrlPanel.TabIndex = 0;
+ //
+ // ctrlImageViewer
+ //
+ this.ctrlImageViewer.Image = null;
+ this.ctrlImageViewer.ImageScale = 1;
+ this.ctrlImageViewer.Location = new System.Drawing.Point(0, 0);
+ this.ctrlImageViewer.Name = "ctrlImageViewer";
+ this.ctrlImageViewer.Selection = new System.Drawing.Rectangle(0, 0, 0, 0);
+ this.ctrlImageViewer.Size = new System.Drawing.Size(327, 326);
+ this.ctrlImageViewer.TabIndex = 0;
+ this.ctrlImageViewer.Text = "ctrlImageViewer";
+ //
+ // ctrlImagePanel
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.ctrlPanel);
+ this.Name = "ctrlImagePanel";
+ this.Size = new System.Drawing.Size(327, 326);
+ this.ctrlPanel.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private Controls.ctrlPanel ctrlPanel;
+ private ctrlImageViewer ctrlImageViewer;
+ }
+}
diff --git a/UI/Debugger/PpuViewer/ctrlImagePanel.cs b/UI/Debugger/PpuViewer/ctrlImagePanel.cs
new file mode 100644
index 0000000..92de6ae
--- /dev/null
+++ b/UI/Debugger/PpuViewer/ctrlImagePanel.cs
@@ -0,0 +1,74 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using Mesen.GUI.Controls;
+
+namespace Mesen.GUI.Debugger.PpuViewer
+{
+ public partial class ctrlImagePanel : BaseControl
+ {
+ private int _scale = 1;
+ private Size _imageSize;
+
+ public Rectangle Selection { get { return ctrlImageViewer.Selection; } set { ctrlImageViewer.Selection = value; } }
+ public Size ImageSize { get { return _imageSize; } set { _imageSize = value; UpdateMapSize(); } }
+ public Image Image { get { return ctrlImageViewer.Image; } set { ctrlImageViewer.Image = value; } }
+ public int ImageScale { get { return _scale; } set { _scale = value; } }
+
+ public new event MouseEventHandler MouseClick { add { ctrlImageViewer.MouseClick += value; } remove { ctrlImageViewer.MouseClick -= value; } }
+
+ public ctrlImagePanel()
+ {
+ InitializeComponent();
+
+ if(DesignMode) {
+ return;
+ }
+
+ ctrlPanel.OnZoom += (scaleDelta) => {
+ double hori = (double)ctrlPanel.HorizontalScroll.Value / _scale + (double)ctrlPanel.Width / 2 / _scale;
+ double vert = (double)ctrlPanel.VerticalScroll.Value / _scale + (double)ctrlPanel.Height / 2 / _scale;
+
+ _scale = Math.Min(16, Math.Max(1, _scale + scaleDelta));
+ UpdateMapSize();
+
+ ctrlPanel.HorizontalScroll.Value = Math.Max(0, Math.Min((int)(hori * _scale) - ctrlPanel.Width / 2, ctrlPanel.HorizontalScroll.Maximum));
+ ctrlPanel.HorizontalScroll.Value = Math.Max(0, Math.Min((int)(hori * _scale) - ctrlPanel.Width / 2, ctrlPanel.HorizontalScroll.Maximum));
+ ctrlPanel.VerticalScroll.Value = Math.Max(0, Math.Min((int)(vert * _scale) - ctrlPanel.Height / 2, ctrlPanel.VerticalScroll.Maximum));
+ ctrlPanel.VerticalScroll.Value = Math.Max(0, Math.Min((int)(vert * _scale) - ctrlPanel.Height / 2, ctrlPanel.VerticalScroll.Maximum));
+ };
+ }
+
+ private void UpdateMapSize()
+ {
+ ctrlImageViewer.Width = ImageSize.Width * _scale;
+ ctrlImageViewer.Height = ImageSize.Height * _scale;
+ ctrlImageViewer.ImageScale = _scale;
+ ctrlImageViewer.Invalidate();
+ }
+
+ protected override void OnInvalidated(InvalidateEventArgs e)
+ {
+ base.OnInvalidated(e);
+ ctrlImageViewer.Invalidate();
+ }
+
+ public void ZoomIn()
+ {
+ _scale = Math.Min(16, _scale + 1);
+ UpdateMapSize();
+ }
+
+ public void ZoomOut()
+ {
+ _scale = Math.Max(1, _scale - 1);
+ UpdateMapSize();
+ }
+ }
+}
diff --git a/UI/Debugger/PpuViewer/ctrlImagePanel.resx b/UI/Debugger/PpuViewer/ctrlImagePanel.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/UI/Debugger/PpuViewer/ctrlImagePanel.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
\ No newline at end of file
diff --git a/UI/Debugger/PpuViewer/frmTileViewer.Designer.cs b/UI/Debugger/PpuViewer/frmTileViewer.Designer.cs
index bea7038..d216a28 100644
--- a/UI/Debugger/PpuViewer/frmTileViewer.Designer.cs
+++ b/UI/Debugger/PpuViewer/frmTileViewer.Designer.cs
@@ -27,9 +27,7 @@
///
private void InitializeComponent()
{
- this.picTilemap = new Mesen.GUI.Controls.ctrlMesenPictureBox();
this.ctrlScanlineCycleSelect = new Mesen.GUI.Debugger.Controls.ctrlScanlineCycleSelect();
- this.pnlTilemap = new System.Windows.Forms.Panel();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
this.cboMemoryType = new Mesen.GUI.Debugger.Controls.ComboBoxWithSeparator();
@@ -44,23 +42,22 @@
this.lblOffset = new System.Windows.Forms.Label();
this.nudOffset = new Mesen.GUI.Controls.MesenNumericUpDown();
this.ctrlPaletteViewer = new Mesen.GUI.Debugger.ctrlPaletteViewer();
- ((System.ComponentModel.ISupportInitialize)(this.picTilemap)).BeginInit();
- this.pnlTilemap.SuspendLayout();
+ this.ctrlImagePanel = new Mesen.GUI.Debugger.PpuViewer.ctrlImagePanel();
+ this.ctrlMesenMenuStrip1 = new Mesen.GUI.Controls.ctrlMesenMenuStrip();
+ this.mnuFile = new System.Windows.Forms.ToolStripMenuItem();
+ this.mnuClose = new System.Windows.Forms.ToolStripMenuItem();
+ this.mnuView = new System.Windows.Forms.ToolStripMenuItem();
+ this.mnuAutoRefresh = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator();
+ this.mnuRefresh = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator();
+ this.mnuZoomIn = new System.Windows.Forms.ToolStripMenuItem();
+ this.mnuZoomOut = new System.Windows.Forms.ToolStripMenuItem();
this.tableLayoutPanel1.SuspendLayout();
this.tableLayoutPanel2.SuspendLayout();
+ this.ctrlMesenMenuStrip1.SuspendLayout();
this.SuspendLayout();
//
- // picTilemap
- //
- this.picTilemap.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
- this.picTilemap.Location = new System.Drawing.Point(0, 0);
- this.picTilemap.Name = "picTilemap";
- this.picTilemap.Size = new System.Drawing.Size(512, 512);
- this.picTilemap.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
- this.picTilemap.TabIndex = 0;
- this.picTilemap.TabStop = false;
- this.picTilemap.DoubleClick += new System.EventHandler(this.picTilemap_DoubleClick);
- //
// ctrlScanlineCycleSelect
//
this.ctrlScanlineCycleSelect.Dock = System.Windows.Forms.DockStyle.Bottom;
@@ -69,31 +66,20 @@
this.ctrlScanlineCycleSelect.Size = new System.Drawing.Size(737, 28);
this.ctrlScanlineCycleSelect.TabIndex = 5;
//
- // pnlTilemap
- //
- this.pnlTilemap.AutoScroll = true;
- this.pnlTilemap.Controls.Add(this.picTilemap);
- this.pnlTilemap.Dock = System.Windows.Forms.DockStyle.Fill;
- this.pnlTilemap.Location = new System.Drawing.Point(3, 3);
- this.pnlTilemap.MinimumSize = new System.Drawing.Size(512, 512);
- this.pnlTilemap.Name = "pnlTilemap";
- this.pnlTilemap.Size = new System.Drawing.Size(531, 540);
- this.pnlTilemap.TabIndex = 6;
- //
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 2;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
- this.tableLayoutPanel1.Controls.Add(this.pnlTilemap, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.tableLayoutPanel2, 1, 0);
+ this.tableLayoutPanel1.Controls.Add(this.ctrlImagePanel, 0, 0);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
- this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
+ this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 24);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 1;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
- this.tableLayoutPanel1.Size = new System.Drawing.Size(737, 546);
+ this.tableLayoutPanel1.Size = new System.Drawing.Size(737, 522);
this.tableLayoutPanel1.TabIndex = 7;
//
// tableLayoutPanel2
@@ -320,6 +306,99 @@
this.ctrlPaletteViewer.TabIndex = 12;
this.ctrlPaletteViewer.SelectionChanged += new Mesen.GUI.Debugger.ctrlPaletteViewer.SelectionChangedHandler(this.ctrlPaletteViewer_SelectionChanged);
//
+ // ctrlImagePanel
+ //
+ this.ctrlImagePanel.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.ctrlImagePanel.Image = null;
+ this.ctrlImagePanel.ImageScale = 1;
+ this.ctrlImagePanel.ImageSize = new System.Drawing.Size(0, 0);
+ this.ctrlImagePanel.Location = new System.Drawing.Point(3, 3);
+ this.ctrlImagePanel.Name = "ctrlImagePanel";
+ this.ctrlImagePanel.Selection = new System.Drawing.Rectangle(0, 0, 0, 0);
+ this.ctrlImagePanel.Size = new System.Drawing.Size(531, 516);
+ this.ctrlImagePanel.TabIndex = 8;
+ //
+ // ctrlMesenMenuStrip1
+ //
+ this.ctrlMesenMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.mnuFile,
+ this.mnuView});
+ this.ctrlMesenMenuStrip1.Location = new System.Drawing.Point(0, 0);
+ this.ctrlMesenMenuStrip1.Name = "ctrlMesenMenuStrip1";
+ this.ctrlMesenMenuStrip1.Size = new System.Drawing.Size(737, 24);
+ this.ctrlMesenMenuStrip1.TabIndex = 9;
+ this.ctrlMesenMenuStrip1.Text = "ctrlMesenMenuStrip1";
+ //
+ // mnuFile
+ //
+ this.mnuFile.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.mnuClose});
+ this.mnuFile.Name = "mnuFile";
+ this.mnuFile.Size = new System.Drawing.Size(37, 20);
+ this.mnuFile.Text = "File";
+ //
+ // mnuClose
+ //
+ this.mnuClose.Image = global::Mesen.GUI.Properties.Resources.Exit;
+ this.mnuClose.Name = "mnuClose";
+ this.mnuClose.Size = new System.Drawing.Size(152, 22);
+ this.mnuClose.Text = "Close";
+ this.mnuClose.Click += new System.EventHandler(this.mnuClose_Click);
+ //
+ // mnuView
+ //
+ this.mnuView.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.mnuAutoRefresh,
+ this.toolStripMenuItem2,
+ this.mnuRefresh,
+ this.toolStripMenuItem1,
+ this.mnuZoomIn,
+ this.mnuZoomOut});
+ this.mnuView.Name = "mnuView";
+ this.mnuView.Size = new System.Drawing.Size(44, 20);
+ this.mnuView.Text = "View";
+ //
+ // mnuAutoRefresh
+ //
+ this.mnuAutoRefresh.Checked = true;
+ this.mnuAutoRefresh.CheckOnClick = true;
+ this.mnuAutoRefresh.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.mnuAutoRefresh.Name = "mnuAutoRefresh";
+ this.mnuAutoRefresh.Size = new System.Drawing.Size(152, 22);
+ this.mnuAutoRefresh.Text = "Auto-refresh";
+ //
+ // toolStripMenuItem2
+ //
+ this.toolStripMenuItem2.Name = "toolStripMenuItem2";
+ this.toolStripMenuItem2.Size = new System.Drawing.Size(149, 6);
+ //
+ // mnuRefresh
+ //
+ this.mnuRefresh.Image = global::Mesen.GUI.Properties.Resources.Refresh;
+ this.mnuRefresh.Name = "mnuRefresh";
+ this.mnuRefresh.Size = new System.Drawing.Size(152, 22);
+ this.mnuRefresh.Text = "Refresh";
+ this.mnuRefresh.Click += new System.EventHandler(this.mnuRefresh_Click);
+ //
+ // toolStripMenuItem1
+ //
+ this.toolStripMenuItem1.Name = "toolStripMenuItem1";
+ this.toolStripMenuItem1.Size = new System.Drawing.Size(149, 6);
+ //
+ // mnuZoomIn
+ //
+ this.mnuZoomIn.Name = "mnuZoomIn";
+ this.mnuZoomIn.Size = new System.Drawing.Size(152, 22);
+ this.mnuZoomIn.Text = "Zoom In";
+ this.mnuZoomIn.Click += new System.EventHandler(this.mnuZoomIn_Click);
+ //
+ // mnuZoomOut
+ //
+ this.mnuZoomOut.Name = "mnuZoomOut";
+ this.mnuZoomOut.Size = new System.Drawing.Size(152, 22);
+ this.mnuZoomOut.Text = "Zoom Out";
+ this.mnuZoomOut.Click += new System.EventHandler(this.mnuZoomOut_Click);
+ //
// frmTileViewer
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@@ -327,22 +406,21 @@
this.ClientSize = new System.Drawing.Size(737, 574);
this.Controls.Add(this.tableLayoutPanel1);
this.Controls.Add(this.ctrlScanlineCycleSelect);
+ this.Controls.Add(this.ctrlMesenMenuStrip1);
this.Name = "frmTileViewer";
this.Text = "Tile Viewer";
- ((System.ComponentModel.ISupportInitialize)(this.picTilemap)).EndInit();
- this.pnlTilemap.ResumeLayout(false);
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel2.ResumeLayout(false);
this.tableLayoutPanel2.PerformLayout();
+ this.ctrlMesenMenuStrip1.ResumeLayout(false);
+ this.ctrlMesenMenuStrip1.PerformLayout();
this.ResumeLayout(false);
+ this.PerformLayout();
}
#endregion
-
- private GUI.Controls.ctrlMesenPictureBox picTilemap;
private Controls.ctrlScanlineCycleSelect ctrlScanlineCycleSelect;
- private System.Windows.Forms.Panel pnlTilemap;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
private System.Windows.Forms.CheckBox chkShowTileGrid;
@@ -357,5 +435,16 @@
private GUI.Controls.MesenNumericUpDown nudOffset;
private Controls.ComboBoxWithSeparator cboMemoryType;
private ctrlPaletteViewer ctrlPaletteViewer;
+ private PpuViewer.ctrlImagePanel ctrlImagePanel;
+ private GUI.Controls.ctrlMesenMenuStrip ctrlMesenMenuStrip1;
+ private System.Windows.Forms.ToolStripMenuItem mnuFile;
+ private System.Windows.Forms.ToolStripMenuItem mnuClose;
+ private System.Windows.Forms.ToolStripMenuItem mnuView;
+ private System.Windows.Forms.ToolStripMenuItem mnuAutoRefresh;
+ private System.Windows.Forms.ToolStripSeparator toolStripMenuItem2;
+ private System.Windows.Forms.ToolStripMenuItem mnuRefresh;
+ private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1;
+ private System.Windows.Forms.ToolStripMenuItem mnuZoomIn;
+ private System.Windows.Forms.ToolStripMenuItem mnuZoomOut;
}
}
\ No newline at end of file
diff --git a/UI/Debugger/PpuViewer/frmTileViewer.cs b/UI/Debugger/PpuViewer/frmTileViewer.cs
index fdbae20..a9682bd 100644
--- a/UI/Debugger/PpuViewer/frmTileViewer.cs
+++ b/UI/Debugger/PpuViewer/frmTileViewer.cs
@@ -1,4 +1,5 @@
-using Mesen.GUI.Forms;
+using Mesen.GUI.Config;
+using Mesen.GUI.Forms;
using System;
using System.Collections.Generic;
using System.ComponentModel;
@@ -21,7 +22,6 @@ namespace Mesen.GUI.Debugger
private byte[] _cgram;
private byte[] _tileSource;
private Bitmap _tileImage;
- private bool _zoomed;
private SnesMemoryType _memoryType = SnesMemoryType.VideoRam;
private int _addressOffset = 0;
private DateTime _lastUpdate = DateTime.MinValue;
@@ -45,7 +45,7 @@ namespace Mesen.GUI.Debugger
_tileData = new byte[512 * 512 * 4];
_tileImage = new Bitmap(512, 512, PixelFormat.Format32bppArgb);
- picTilemap.Image = _tileImage;
+ ctrlImagePanel.Image = _tileImage;
ctrlScanlineCycleSelect.Initialize(241, 0);
@@ -59,6 +59,15 @@ namespace Mesen.GUI.Debugger
InitMemoryTypeDropdown();
cboFormat.SetEnumValue(TileFormat.Bpp4);
ctrlPaletteViewer.SelectionMode = PaletteSelectionMode.SixteenColors;
+
+ InitShortcuts();
+ }
+
+ private void InitShortcuts()
+ {
+ mnuRefresh.InitShortcut(this, nameof(DebuggerShortcutsConfig.Refresh));
+ mnuZoomIn.InitShortcut(this, nameof(DebuggerShortcutsConfig.ZoomIn));
+ mnuZoomOut.InitShortcut(this, nameof(DebuggerShortcutsConfig.ZoomOut));
}
protected override void OnFormClosed(FormClosedEventArgs e)
@@ -127,7 +136,7 @@ namespace Mesen.GUI.Debugger
if(_tileImage.Width != mapWidth || _tileImage.Height != mapHeight) {
_tileImage = new Bitmap(mapWidth, mapHeight, PixelFormat.Format32bppArgb);
- picTilemap.Image = _tileImage;
+ ctrlImagePanel.Image = _tileImage;
}
using(Graphics g = Graphics.FromImage(_tileImage)) {
@@ -141,7 +150,7 @@ namespace Mesen.GUI.Debugger
}
UpdateMapSize();
- picTilemap.Invalidate();
+ ctrlImagePanel.Invalidate();
ctrlPaletteViewer.RefreshViewer();
}
@@ -152,8 +161,7 @@ namespace Mesen.GUI.Debugger
int mapWidth = _options.Width * 8;
int mapHeight = tileCount / _options.Width * 8;
- picTilemap.Width = _zoomed ? mapWidth * 2 : mapWidth;
- picTilemap.Height = _zoomed ? mapHeight * 2 : mapHeight;
+ ctrlImagePanel.ImageSize = new Size(mapWidth, mapHeight);
}
private void InitMemoryTypeDropdown()
@@ -170,12 +178,6 @@ namespace Mesen.GUI.Debugger
cboMemoryType.EndUpdate();
}
- private void picTilemap_DoubleClick(object sender, EventArgs e)
- {
- _zoomed = !_zoomed;
- UpdateMapSize();
- }
-
private void chkShowTileGrid_Click(object sender, EventArgs e)
{
_options.ShowTileGrid = chkShowTileGrid.Checked;
@@ -238,5 +240,26 @@ namespace Mesen.GUI.Debugger
_options.Palette = ctrlPaletteViewer.SelectedPalette;
RefreshViewer();
}
+
+ private void mnuRefresh_Click(object sender, EventArgs e)
+ {
+ RefreshData();
+ RefreshViewer();
+ }
+
+ private void mnuZoomIn_Click(object sender, EventArgs e)
+ {
+ ctrlImagePanel.ZoomIn();
+ }
+
+ private void mnuZoomOut_Click(object sender, EventArgs e)
+ {
+ ctrlImagePanel.ZoomOut();
+ }
+
+ private void mnuClose_Click(object sender, EventArgs e)
+ {
+ Close();
+ }
}
}
diff --git a/UI/Debugger/PpuViewer/frmTileViewer.resx b/UI/Debugger/PpuViewer/frmTileViewer.resx
index 8766f29..914cde3 100644
--- a/UI/Debugger/PpuViewer/frmTileViewer.resx
+++ b/UI/Debugger/PpuViewer/frmTileViewer.resx
@@ -120,4 +120,7 @@
17, 17
+
+ 107, 17
+
\ No newline at end of file
diff --git a/UI/Debugger/PpuViewer/frmTilemapViewer.Designer.cs b/UI/Debugger/PpuViewer/frmTilemapViewer.Designer.cs
index 66d8d95..db12544 100644
--- a/UI/Debugger/PpuViewer/frmTilemapViewer.Designer.cs
+++ b/UI/Debugger/PpuViewer/frmTilemapViewer.Designer.cs
@@ -27,13 +27,11 @@
///
private void InitializeComponent()
{
- this.picTilemap = new Mesen.GUI.Debugger.PpuViewer.ctrlImageViewer();
this.btnLayer1 = new System.Windows.Forms.Button();
this.btnLayer2 = new System.Windows.Forms.Button();
this.btnLayer3 = new System.Windows.Forms.Button();
this.btnLayer4 = new System.Windows.Forms.Button();
this.ctrlScanlineCycleSelect = new Mesen.GUI.Debugger.Controls.ctrlScanlineCycleSelect();
- this.pnlTilemap = new System.Windows.Forms.Panel();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
this.chkShowScrollOverlay = new System.Windows.Forms.CheckBox();
@@ -69,6 +67,7 @@
this.txtBitDepth = new System.Windows.Forms.TextBox();
this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel();
this.lblLayer = new System.Windows.Forms.Label();
+ this.ctrlImagePanel = new Mesen.GUI.Debugger.PpuViewer.ctrlImagePanel();
this.ctrlMesenMenuStrip1 = new Mesen.GUI.Controls.ctrlMesenMenuStrip();
this.mnuFile = new System.Windows.Forms.ToolStripMenuItem();
this.mnuClose = new System.Windows.Forms.ToolStripMenuItem();
@@ -79,7 +78,6 @@
this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator();
this.mnuZoomIn = new System.Windows.Forms.ToolStripMenuItem();
this.mnuZoomOut = new System.Windows.Forms.ToolStripMenuItem();
- this.pnlTilemap.SuspendLayout();
this.tableLayoutPanel1.SuspendLayout();
this.tableLayoutPanel2.SuspendLayout();
this.grpTileInfo.SuspendLayout();
@@ -90,19 +88,6 @@
this.ctrlMesenMenuStrip1.SuspendLayout();
this.SuspendLayout();
//
- // picTilemap
- //
- this.picTilemap.Image = null;
- this.picTilemap.ImageScale = 1;
- this.picTilemap.Location = new System.Drawing.Point(0, 0);
- this.picTilemap.Margin = new System.Windows.Forms.Padding(0);
- this.picTilemap.Name = "picTilemap";
- this.picTilemap.Selection = new System.Drawing.Rectangle(0, 0, 0, 0);
- this.picTilemap.Size = new System.Drawing.Size(512, 471);
- this.picTilemap.TabIndex = 0;
- this.picTilemap.TabStop = false;
- this.picTilemap.MouseClick += new System.Windows.Forms.MouseEventHandler(this.picTilemap_MouseClick);
- //
// btnLayer1
//
this.btnLayer1.BackColor = System.Drawing.SystemColors.ControlLight;
@@ -159,24 +144,14 @@
this.ctrlScanlineCycleSelect.Size = new System.Drawing.Size(668, 28);
this.ctrlScanlineCycleSelect.TabIndex = 5;
//
- // pnlTilemap
- //
- this.pnlTilemap.AutoScroll = true;
- this.pnlTilemap.Controls.Add(this.picTilemap);
- this.pnlTilemap.Dock = System.Windows.Forms.DockStyle.Fill;
- this.pnlTilemap.Location = new System.Drawing.Point(3, 31);
- this.pnlTilemap.Name = "pnlTilemap";
- this.pnlTilemap.Size = new System.Drawing.Size(513, 474);
- this.pnlTilemap.TabIndex = 6;
- //
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 2;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
- this.tableLayoutPanel1.Controls.Add(this.pnlTilemap, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.tableLayoutPanel2, 1, 0);
this.tableLayoutPanel1.Controls.Add(this.tableLayoutPanel3, 0, 0);
+ this.tableLayoutPanel1.Controls.Add(this.ctrlImagePanel, 0, 1);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 24);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
@@ -583,6 +558,18 @@
this.lblLayer.TabIndex = 5;
this.lblLayer.Text = "Layer:";
//
+ // ctrlImagePanel
+ //
+ this.ctrlImagePanel.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.ctrlImagePanel.Image = null;
+ this.ctrlImagePanel.ImageSize = new System.Drawing.Size(0, 0);
+ this.ctrlImagePanel.Location = new System.Drawing.Point(3, 31);
+ this.ctrlImagePanel.Name = "ctrlImagePanel";
+ this.ctrlImagePanel.Selection = new System.Drawing.Rectangle(0, 0, 0, 0);
+ this.ctrlImagePanel.Size = new System.Drawing.Size(513, 474);
+ this.ctrlImagePanel.TabIndex = 9;
+ this.ctrlImagePanel.MouseClick += new System.Windows.Forms.MouseEventHandler(this.ctrlImagePanel_MouseClick);
+ //
// ctrlMesenMenuStrip1
//
this.ctrlMesenMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
@@ -675,7 +662,6 @@
this.MainMenuStrip = this.ctrlMesenMenuStrip1;
this.Name = "frmTilemapViewer";
this.Text = "Tilemap Viewer";
- this.pnlTilemap.ResumeLayout(false);
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel2.ResumeLayout(false);
this.tableLayoutPanel2.PerformLayout();
@@ -695,14 +681,11 @@
}
#endregion
-
- private Mesen.GUI.Debugger.PpuViewer.ctrlImageViewer picTilemap;
private System.Windows.Forms.Button btnLayer1;
private System.Windows.Forms.Button btnLayer2;
private System.Windows.Forms.Button btnLayer3;
private System.Windows.Forms.Button btnLayer4;
private Controls.ctrlScanlineCycleSelect ctrlScanlineCycleSelect;
- private System.Windows.Forms.Panel pnlTilemap;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
private System.Windows.Forms.CheckBox chkShowTileGrid;
@@ -748,5 +731,6 @@
private System.Windows.Forms.TextBox txtTileSize;
private System.Windows.Forms.TextBox txtTilesetAddress;
private System.Windows.Forms.TextBox txtBitDepth;
+ private PpuViewer.ctrlImagePanel ctrlImagePanel;
}
}
\ No newline at end of file
diff --git a/UI/Debugger/PpuViewer/frmTilemapViewer.cs b/UI/Debugger/PpuViewer/frmTilemapViewer.cs
index 03f64a5..a8f4d61 100644
--- a/UI/Debugger/PpuViewer/frmTilemapViewer.cs
+++ b/UI/Debugger/PpuViewer/frmTilemapViewer.cs
@@ -25,7 +25,6 @@ namespace Mesen.GUI.Debugger
private byte[] _vram;
private byte[] _tilemapData;
private Bitmap _tilemapImage;
- private int _scale = 1;
private int _selectedRow = 0;
private int _selectedColumn = 0;
private DateTime _lastUpdate = DateTime.MinValue;
@@ -49,7 +48,7 @@ namespace Mesen.GUI.Debugger
_tilemapData = new byte[1024 * 1024 * 4];
_tilemapImage = new Bitmap(1024, 1024, PixelFormat.Format32bppArgb);
- picTilemap.Image = _tilemapImage;
+ ctrlImagePanel.Image = _tilemapImage;
ctrlScanlineCycleSelect.Initialize(241, 0);
@@ -162,7 +161,7 @@ namespace Mesen.GUI.Debugger
int mapHeight = GetHeight();
if(_tilemapImage.Width != mapWidth || _tilemapImage.Height != mapHeight) {
_tilemapImage = new Bitmap(mapWidth, mapHeight, PixelFormat.Format32bppArgb);
- picTilemap.Image = _tilemapImage;
+ ctrlImagePanel.Image = _tilemapImage;
}
using(Graphics g = Graphics.FromImage(_tilemapImage)) {
GCHandle handle = GCHandle.Alloc(_tilemapData, GCHandleType.Pinned);
@@ -181,20 +180,12 @@ namespace Mesen.GUI.Debugger
btnLayer3.Enabled = _layerBpp[_state.Ppu.BgMode, 2] > 0;
btnLayer4.Enabled = _layerBpp[_state.Ppu.BgMode, 3] > 0;
- UpdateMapSize();
- picTilemap.Selection = new Rectangle(_selectedColumn * 8, _selectedRow * 8, IsLargeTileWidth ? 16 : 8, IsLargeTileHeight ? 16 : 8);
- picTilemap.Invalidate();
+ ctrlImagePanel.ImageSize = new Size(GetWidth(), GetHeight());
+ ctrlImagePanel.Selection = new Rectangle(_selectedColumn * 8, _selectedRow * 8, IsLargeTileWidth ? 16 : 8, IsLargeTileHeight ? 16 : 8);
UpdateFields();
}
- private void UpdateMapSize()
- {
- picTilemap.ImageScale = _scale;
- picTilemap.Width = GetWidth() * _scale;
- picTilemap.Height = GetHeight() * _scale;
- }
-
private void UpdateFields()
{
if(_state.Ppu.BgMode == 7) {
@@ -292,14 +283,12 @@ namespace Mesen.GUI.Debugger
private void mnuZoomIn_Click(object sender, EventArgs e)
{
- _scale = Math.Min(8, _scale + 1);
- UpdateMapSize();
+ ctrlImagePanel.ZoomIn();
}
private void mnuZoomOut_Click(object sender, EventArgs e)
{
- _scale = Math.Max(1, _scale - 1);
- UpdateMapSize();
+ ctrlImagePanel.ZoomOut();
}
private void mnuClose_Click(object sender, EventArgs e)
@@ -307,10 +296,10 @@ namespace Mesen.GUI.Debugger
Close();
}
- private void picTilemap_MouseClick(object sender, MouseEventArgs e)
+ private void ctrlImagePanel_MouseClick(object sender, MouseEventArgs e)
{
- _selectedColumn = e.X / (8 * _scale);
- _selectedRow = e.Y / (8 * _scale);
+ _selectedColumn = e.X / (8 * ctrlImagePanel.ImageScale);
+ _selectedRow = e.Y / (8 * ctrlImagePanel.ImageScale);
if(IsLargeTileWidth) {
_selectedColumn &= 0xFE;
diff --git a/UI/UI.csproj b/UI/UI.csproj
index e5e6f0f..78890ce 100644
--- a/UI/UI.csproj
+++ b/UI/UI.csproj
@@ -252,6 +252,9 @@
+
+ Component
+
UserControl
@@ -276,6 +279,12 @@
frmBreakOn.cs
+
+ UserControl
+
+
+ ctrlImagePanel.cs
+
Component
@@ -793,6 +802,9 @@
frmMemoryViewerColors.cs
+
+ ctrlImagePanel.cs
+
ctrlPaletteViewer.cs