BizHawk/BizHawk.Client.EmuHawk/tools/PCE/PCEBGViewer.cs

168 lines
3.5 KiB
C#
Raw Normal View History

2012-03-12 05:26:48 +00:00
using System;
using System.Collections.Generic;
2012-03-12 05:26:48 +00:00
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;
using BizHawk.Client.Common;
using BizHawk.Emulation.Cores.PCEngine;
using BizHawk.Emulation.Common;
2012-03-12 05:26:48 +00:00
namespace BizHawk.Client.EmuHawk
2012-03-12 05:26:48 +00:00
{
public partial class PceBgViewer : Form, IToolFormAutoConfig
2012-03-12 05:26:48 +00:00
{
2014-12-15 03:19:23 +00:00
[RequiredService]
private PCEngine _pce { get; set; }
2014-12-14 00:46:14 +00:00
[ConfigPersist]
private int RefreshRateConfig
{
get
{
return RefreshRate.Value;
}
set
{
RefreshRate.Value = Math.Max(Math.Min(value, RefreshRate.Maximum), RefreshRate.Minimum);
}
}
2014-12-14 00:46:14 +00:00
private int _vdcType;
public PceBgViewer()
2012-03-12 05:26:48 +00:00
{
InitializeComponent();
Activated += (o, e) => Generate();
}
private void PceBgViewer_Load(object sender, EventArgs e)
{
}
private void RefreshFloatingWindowControl()
2012-03-12 05:26:48 +00:00
{
}
#region Public API
public bool AskSaveChanges() { return true; }
public bool UpdateBefore { get { return true; } }
2012-03-12 05:26:48 +00:00
public unsafe void Generate()
{
2014-12-14 00:46:14 +00:00
if (_pce.Frame % RefreshRate.Value != 0)
{
return;
}
var vdc = _vdcType == 0 ? _pce.VDC1 : _pce.VDC2;
var width = 8 * vdc.BatWidth;
var height = 8 * vdc.BatHeight;
var buf = canvas.Bat.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, canvas.Bat.PixelFormat);
var pitch = buf.Stride / 4;
var begin = (int*)buf.Scan0.ToPointer();
2012-03-12 05:26:48 +00:00
2013-04-15 02:14:14 +00:00
int* p = begin;
2012-03-12 05:26:48 +00:00
for (int y = 0; y < height; ++y)
{
int yTile = y / 8;
int yOfs = y % 8;
for (int x = 0; x < width; ++x, ++p)
{
int xTile = x / 8;
int xOfs = x % 8;
int tileNo = vdc.VRAM[(ushort)(((yTile * vdc.BatWidth) + xTile))] & 0x07FF;
int paletteNo = vdc.VRAM[(ushort)(((yTile * vdc.BatWidth) + xTile))] >> 12;
2012-03-12 05:26:48 +00:00
int paletteBase = paletteNo * 16;
byte c = vdc.PatternBuffer[(tileNo * 64) + (yOfs * 8) + xOfs];
2012-03-12 05:26:48 +00:00
if (c == 0)
{
2013-11-20 01:37:54 +00:00
*p = _pce.VCE.Palette[0];
}
2012-03-12 05:26:48 +00:00
else
{
2013-11-20 01:37:54 +00:00
*p = _pce.VCE.Palette[paletteBase + c];
2012-03-12 05:26:48 +00:00
}
}
2012-03-12 05:26:48 +00:00
p += pitch - width;
}
2013-11-20 01:37:54 +00:00
canvas.Bat.UnlockBits(buf);
2012-03-12 05:26:48 +00:00
canvas.Refresh();
}
public void Restart()
{
2014-12-14 00:46:14 +00:00
// Nothing to do
2012-03-12 05:26:48 +00:00
}
public void UpdateValues()
{
2014-12-14 00:46:14 +00:00
Generate();
2012-03-12 05:26:48 +00:00
}
public void FastUpdate()
{
// Do nothing
}
#endregion
#region Events
#region Menu
private void FileSubMenu_DropDownOpened(object sender, EventArgs e)
{
VDC2MenuItem.Enabled = _pce.SystemId == "SGX";
VDC1MenuItem.Checked = _vdcType == 0;
VDC2MenuItem.Checked = _vdcType == 1;
}
private void VDC1MenuItem_Click(object sender, EventArgs e)
{
_vdcType = 0;
}
private void VDC2MenuItem_Click(object sender, EventArgs e)
2012-03-12 05:26:48 +00:00
{
_vdcType = 1;
2012-03-12 05:26:48 +00:00
}
private void ExitMenuItem_Click(object sender, EventArgs e)
2012-03-12 22:05:53 +00:00
{
2013-04-15 02:14:14 +00:00
Close();
2012-03-12 22:05:53 +00:00
}
#endregion
#region Dialog and Controls
private void Canvas_MouseMove(object sender, MouseEventArgs e)
{
var vdc = _vdcType == 0 ? _pce.VDC1 : _pce.VDC2;
int xTile = e.X / 8;
int yTile = e.Y / 8;
int tileNo = vdc.VRAM[(ushort)((yTile * vdc.BatWidth) + xTile)] & 0x07FF;
int paletteNo = vdc.VRAM[(ushort)((yTile * vdc.BatWidth) + xTile)] >> 12;
TileIDLabel.Text = tileNo.ToString();
XYLabel.Text = xTile + ":" + yTile;
PaletteLabel.Text = paletteNo.ToString();
}
protected override void OnShown(EventArgs e)
{
RefreshFloatingWindowControl();
base.OnShown(e);
}
#endregion
#endregion
2012-03-12 05:26:48 +00:00
}
}