diff options
Diffstat (limited to 'Ryujinx/Ui/RendererWidgetBase.cs')
-rw-r--r-- | Ryujinx/Ui/RendererWidgetBase.cs | 73 |
1 files changed, 71 insertions, 2 deletions
diff --git a/Ryujinx/Ui/RendererWidgetBase.cs b/Ryujinx/Ui/RendererWidgetBase.cs index 699f06c5..dee5cbb6 100644 --- a/Ryujinx/Ui/RendererWidgetBase.cs +++ b/Ryujinx/Ui/RendererWidgetBase.cs @@ -4,6 +4,7 @@ using Gdk; using Gtk; using Ryujinx.Common; using Ryujinx.Common.Configuration; +using Ryujinx.Common.Logging; using Ryujinx.Configuration; using Ryujinx.Graphics.GAL; using Ryujinx.HLE.HOS.Services.Hid; @@ -11,13 +12,19 @@ using Ryujinx.Input; using Ryujinx.Input.GTK3; using Ryujinx.Input.HLE; using Ryujinx.Ui.Widgets; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Formats.Png; +using SixLabors.ImageSharp.PixelFormats; +using SixLabors.ImageSharp.Processing; using System; using System.Diagnostics; -using System.Linq; +using System.IO; using System.Threading; +using System.Threading.Tasks; namespace Ryujinx.Ui { + using Image = SixLabors.ImageSharp.Image; using Key = Input.Key; using Switch = HLE.Switch; @@ -33,6 +40,8 @@ namespace Ryujinx.Ui public Switch Device { get; private set; } public IRenderer Renderer { get; private set; } + public bool ScreenshotRequested { get; set; } + public static event EventHandler<StatusUpdatedEventArgs> StatusUpdatedEvent; private bool _isActive; @@ -290,10 +299,56 @@ namespace Ryujinx.Ui Renderer = Device.Gpu.Renderer; Renderer?.Window.SetSize(_windowWidth, _windowHeight); + if (Renderer != null) + { + Renderer.ScreenCaptured += Renderer_ScreenCaptured; + } + NpadManager.Initialize(device, ConfigurationState.Instance.Hid.InputConfig, ConfigurationState.Instance.Hid.EnableKeyboard, ConfigurationState.Instance.Hid.EnableMouse); TouchScreenManager.Initialize(device); } + private unsafe void Renderer_ScreenCaptured(object sender, ScreenCaptureImageInfo e) + { + if (e.Data.Length > 0) + { + Task.Run(() => + { + lock (this) + { + var currentTime = DateTime.Now; + string filename = $"ryujinx_capture_{currentTime.Year}-{currentTime.Month:D2}-{currentTime.Day:D2}_{currentTime.Hour:D2}-{currentTime.Minute:D2}-{currentTime.Second:D2}.png"; + string directory = System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyPictures), "Ryujinx"); + string path = System.IO.Path.Combine(directory, filename); + + Directory.CreateDirectory(directory); + + Image image = e.IsBgra ? Image.LoadPixelData<Bgra32>(e.Data, e.Width, e.Height) + : Image.LoadPixelData<Rgba32>(e.Data, e.Width, e.Height); + + if (e.FlipX) + { + image.Mutate(x => x.Flip(FlipMode.Horizontal)); + } + + if (e.FlipY) + { + image.Mutate(x => x.Flip(FlipMode.Vertical)); + } + + image.SaveAsPng(path, new PngEncoder() + { + ColorType = PngColorType.Rgb + }); + + image.Dispose(); + + Logger.Notice.Print(LogClass.Application, $"Screenshot saved to {path}", "Screenshot"); + } + }); + } + } + public void Render() { Gtk.Window parent = Toplevel as Gtk.Window; @@ -490,6 +545,14 @@ namespace Ryujinx.Ui Device.EnableDeviceVsync = !Device.EnableDeviceVsync; } + if ((currentHotkeyState.HasFlag(KeyboardHotkeyState.Screenshot) && + !_prevHotkeyState.HasFlag(KeyboardHotkeyState.Screenshot)) || ScreenshotRequested) + { + ScreenshotRequested = false; + + Renderer.Screenshot(); + } + _prevHotkeyState = currentHotkeyState; } @@ -516,7 +579,8 @@ namespace Ryujinx.Ui private enum KeyboardHotkeyState { None, - ToggleVSync + ToggleVSync, + Screenshot } private KeyboardHotkeyState GetHotkeyState() @@ -527,6 +591,11 @@ namespace Ryujinx.Ui { state |= KeyboardHotkeyState.ToggleVSync; } + + if (_keyboardInterface.IsPressed((Key)ConfigurationState.Instance.Hid.Hotkeys.Value.Screenshot)) + { + state |= KeyboardHotkeyState.Screenshot; + } return state; } |