Files
Troll-V2/Quasar.Client/Messages/ColorInvertHandler.cs
T

62 lines
2.0 KiB
C#
Raw Normal View History

2026-08-27 11:22:16 -06:00
using Quasar.Common.Messages;
using Quasar.Common.Networking;
using System.Runtime.InteropServices;
namespace Quasar.Client.Messages
{
public class ColorInvertHandler : IMessageProcessor
{
[StructLayout(LayoutKind.Sequential)]
private struct MAGCOLOREFFECT
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 25)]
public float[] transform;
}
[DllImport("Magnification.dll", CallingConvention = CallingConvention.StdCall)]
private static extern bool MagInitialize();
[DllImport("Magnification.dll", CallingConvention = CallingConvention.StdCall)]
private static extern bool MagUninitialize();
[DllImport("Magnification.dll", CallingConvention = CallingConvention.StdCall)]
private static extern bool MagSetFullscreenColorEffect(ref MAGCOLOREFFECT pEffect);
private static readonly float[] _invertMatrix = {
-1, 0, 0, 0, 0,
0, -1, 0, 0, 0,
0, 0, -1, 0, 0,
0, 0, 0, 1, 0,
1, 1, 1, 0, 1
};
private static readonly float[] _identityMatrix = {
1, 0, 0, 0, 0,
0, 1, 0, 0, 0,
0, 0, 1, 0, 0,
0, 0, 0, 1, 0,
0, 0, 0, 0, 1
};
public bool CanExecute(IMessage message) =>
message is DoStartColorInvert || message is DoStopColorInvert;
public bool CanExecuteFrom(ISender sender) => true;
public void Execute(ISender sender, IMessage message)
{
if (message is DoStartColorInvert)
ApplyEffect(_invertMatrix);
else if (message is DoStopColorInvert)
ApplyEffect(_identityMatrix);
}
private static void ApplyEffect(float[] matrix)
{
MagInitialize();
var effect = new MAGCOLOREFFECT { transform = matrix };
MagSetFullscreenColorEffect(ref effect);
}
}
}