1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +00:00
SpoinkyNL 25f8f1e72f Added device identification to surface editor
Fixed dialog rendering
Cleaned up XAML
2019-11-22 20:46:34 +01:00

83 lines
2.6 KiB
C#

using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using Artemis.Core.Events;
using Artemis.Core.Services.Interfaces;
using Stylet;
namespace Artemis.UI.Screens.Settings.Debug
{
public class DebugViewModel : Screen, IScreenViewModel
{
private readonly ICoreService _coreService;
private readonly IRgbService _rgbService;
public DebugViewModel(ICoreService coreService, IRgbService rgbService)
{
_coreService = coreService;
_rgbService = rgbService;
}
public ImageSource CurrentFrame { get; set; }
public double CurrentFps { get; set; }
public string Title => "Debugger";
public void ForceGarbageCollection()
{
GC.Collect();
GC.WaitForPendingFinalizers();
}
private void CoreServiceOnFrameRendered(object sender, FrameRenderedEventArgs e)
{
if (e.Bitmap == null)
return;
var imageSource = ImageSourceFromBitmap(e.Bitmap);
imageSource.Freeze();
Execute.PostToUIThread(() => { CurrentFrame = imageSource; });
}
private void CoreServiceOnFrameRendering(object sender, FrameRenderingEventArgs e)
{
CurrentFps = Math.Round(1.0 / e.DeltaTime, 2);
}
protected override void OnActivate()
{
_coreService.FrameRendered += CoreServiceOnFrameRendered;
_coreService.FrameRendering += CoreServiceOnFrameRendering;
base.OnActivate();
}
protected override void OnDeactivate()
{
_coreService.FrameRendered -= CoreServiceOnFrameRendered;
_coreService.FrameRendering -= CoreServiceOnFrameRendering;
base.OnDeactivate();
}
// This is much quicker than saving the bitmap into a memory stream and converting it
private static ImageSource ImageSourceFromBitmap(Bitmap bmp)
{
var handle = bmp.GetHbitmap();
try
{
return Imaging.CreateBitmapSourceFromHBitmap(handle, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
}
finally
{
DeleteObject(handle);
}
}
[DllImport("gdi32.dll", EntryPoint = "DeleteObject")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool DeleteObject([In] IntPtr hObject);
}
}