public void RefreshViewer() { int height = _isGameboyMode ? 256 : 240; if (_previewImage == null || _previewImage.Height != height) { _previewData = new byte[256 * height * 4]; _previewImage = new Bitmap(256, height, PixelFormat.Format32bppPArgb); ctrlImagePanel.ImageSize = new Size(256, height); ctrlImagePanel.Image = _previewImage; } ctrlSpriteList.SetData(_state, _oamRam, _state.Ppu.OamMode, _isGameboyMode); if (_isGameboyMode) { DebugApi.GetGameboySpritePreview(_options, _state.Gameboy.Ppu, _vram, _oamRam, _previewData); } else { DebugApi.GetSpritePreview(_options, _state.Ppu, _vram, _oamRam, _cgram, _previewData); } using (Graphics g = Graphics.FromImage(_previewImage)) { GCHandle handle = GCHandle.Alloc(_previewData, GCHandleType.Pinned); Bitmap source = new Bitmap(256, height, 4 * 256, PixelFormat.Format32bppPArgb, handle.AddrOfPinnedObject()); g.DrawImage(source, 0, 0); handle.Free(); } if (_options.SelectedSprite >= 0) { ctrlImagePanel.Selection = GetSpriteInfo(_options.SelectedSprite).GetBounds(); } else { ctrlImagePanel.Selection = Rectangle.Empty; } ctrlImagePanel.Refresh(); }