using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using Steamworks.Data; namespace Steamworks { /// /// Class for utilizing the Steam Screenshots API. /// public class SteamScreenshots : SteamClientClass { internal static ISteamScreenshots? Internal => Interface as ISteamScreenshots; internal override bool InitializeInterface( bool server ) { SetInterface( server, new ISteamScreenshots( server ) ); if ( Interface is null || Interface.Self == IntPtr.Zero ) return false; InstallEvents(); return true; } internal static void InstallEvents() { Dispatch.Install( x => OnScreenshotRequested?.Invoke() ); Dispatch.Install( x => { if ( x.Result != Result.OK ) OnScreenshotFailed?.Invoke( x.Result ); else OnScreenshotReady?.Invoke( new Screenshot { Value = x.Local } ); } ); } /// /// Invoked when a screenshot has been requested by the user from the Steam screenshot hotkey. /// This will only be called if is true, in which case Steam /// will not take the screenshot itself. /// public static event Action? OnScreenshotRequested; /// /// Invoked when a screenshot has been successfully written or otherwise added to the library and can now be tagged. /// public static event Action? OnScreenshotReady; /// /// Invoked when a screenshot attempt failed. /// public static event Action? OnScreenshotFailed; /// /// Writes a screenshot to the user's screenshot library given the raw image data, which must be in RGB format. /// The return value is a handle that is valid for the duration of the game process and can be used to apply tags. /// public unsafe static Screenshot? WriteScreenshot( byte[] data, int width, int height ) { if (Internal is null) { return null; } fixed ( byte* ptr = data ) { var handle = Internal.WriteScreenshot( (IntPtr)ptr, (uint)data.Length, width, height ); if ( handle.Value == 0 ) return null; return new Screenshot { Value = handle }; } } /// /// Adds a screenshot to the user's screenshot library from disk. If a thumbnail is provided, it must be 200 pixels wide and the same aspect ratio /// as the screenshot, otherwise a thumbnail will be generated if the user uploads the screenshot. The screenshots must be in either JPEG or TGA format. /// The return value is a handle that is valid for the duration of the game process and can be used to apply tags. /// JPEG, TGA, and PNG formats are supported. /// public unsafe static Screenshot? AddScreenshot( string filename, string thumbnail, int width, int height ) { if (Internal is null) { return null; } var handle = Internal.AddScreenshotToLibrary( filename, thumbnail, width, height ); if ( handle.Value == 0 ) return null; return new Screenshot { Value = handle }; } /// /// Causes the Steam overlay to take a screenshot. /// If screenshots are being hooked by the game then a /// callback is sent back to the game instead. /// public static void TriggerScreenshot() => Internal?.TriggerScreenshot(); /// /// Toggles whether the overlay handles screenshots when the user presses the screenshot hotkey, or if the game handles them. /// /// Hooking is disabled by default, and only ever enabled if you do so with this function. /// If the hooking is enabled, then the callback will be sent if the user presses the hotkey or /// when TriggerScreenshot is called, and then the game is expected to call or in response. /// /// public static bool Hooked { get => Internal != null && Internal.IsScreenshotsHooked(); set => Internal?.HookScreenshots( value ); } } }