mirror of
https://github.com/Ryujinx/Ryujinx.git
synced 2024-12-28 17:51:22 -08:00
0fbcd630bc
* Replace usage of `DllImport` with `LibraryImport` * Mark methods as `partial` * Marshalling * More `partial` & marshalling * More `partial` and marshalling * More partial and marshalling * Update GdiPlusHelper to LibraryImport * Unicorn * More Partial * Marshal * Specify EntryPoint * Specify EntryPoint * Change GlobalMemoryStatusEx to LibraryImport * Change RegisterClassEx to LibraryImport * Define EntryPoints * Update Ryujinx.Ava/Ui/Controls/Win32NativeInterop.cs Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com> * Update Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFmpegApi.cs Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com> * Move return mashal * Remove calling convention specification * Remove calling conventions * Update Ryujinx.Common/SystemInfo/WindowsSystemInfo.cs Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com> * Update Ryujinx/Modules/Updater/Updater.cs Co-authored-by: Mary-nyan <thog@protonmail.com> * Update Ryujinx.Ava/Modules/Updater/Updater.cs Co-authored-by: Mary-nyan <thog@protonmail.com> Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com> Co-authored-by: Mary-nyan <thog@protonmail.com>
77 lines
2.3 KiB
C#
77 lines
2.3 KiB
C#
using System;
|
|
using System.Runtime.InteropServices;
|
|
using System.Runtime.Versioning;
|
|
|
|
namespace Ryujinx.Common.SystemInterop
|
|
{
|
|
[SupportedOSPlatform("windows")]
|
|
public static partial class GdiPlusHelper
|
|
{
|
|
private const string LibraryName = "gdiplus.dll";
|
|
|
|
private static readonly IntPtr _initToken;
|
|
|
|
static GdiPlusHelper()
|
|
{
|
|
CheckStatus(GdiplusStartup(out _initToken, StartupInputEx.Default, out _));
|
|
}
|
|
|
|
private static void CheckStatus(int gdiStatus)
|
|
{
|
|
if (gdiStatus != 0)
|
|
{
|
|
throw new Exception($"GDI Status Error: {gdiStatus}");
|
|
}
|
|
}
|
|
|
|
private struct StartupInputEx
|
|
{
|
|
public int GdiplusVersion;
|
|
|
|
#pragma warning disable CS0649
|
|
public IntPtr DebugEventCallback;
|
|
public int SuppressBackgroundThread;
|
|
public int SuppressExternalCodecs;
|
|
public int StartupParameters;
|
|
#pragma warning restore CS0649
|
|
|
|
public static StartupInputEx Default => new StartupInputEx
|
|
{
|
|
// We assume Windows 8 and upper
|
|
GdiplusVersion = 2,
|
|
DebugEventCallback = IntPtr.Zero,
|
|
SuppressBackgroundThread = 0,
|
|
SuppressExternalCodecs = 0,
|
|
StartupParameters = 0,
|
|
};
|
|
}
|
|
|
|
private struct StartupOutput
|
|
{
|
|
public IntPtr NotificationHook;
|
|
public IntPtr NotificationUnhook;
|
|
}
|
|
|
|
[LibraryImport(LibraryName)]
|
|
private static partial int GdiplusStartup(out IntPtr token, in StartupInputEx input, out StartupOutput output);
|
|
|
|
[LibraryImport(LibraryName)]
|
|
private static partial int GdipCreateFromHWND(IntPtr hwnd, out IntPtr graphics);
|
|
|
|
[LibraryImport(LibraryName)]
|
|
private static partial int GdipDeleteGraphics(IntPtr graphics);
|
|
|
|
[LibraryImport(LibraryName)]
|
|
private static partial int GdipGetDpiX(IntPtr graphics, out float dpi);
|
|
|
|
public static float GetDpiX(IntPtr hwnd)
|
|
{
|
|
CheckStatus(GdipCreateFromHWND(hwnd, out IntPtr graphicsHandle));
|
|
CheckStatus(GdipGetDpiX(graphicsHandle, out float result));
|
|
CheckStatus(GdipDeleteGraphics(graphicsHandle));
|
|
|
|
return result;
|
|
}
|
|
}
|
|
}
|