From b37c989e0f2c697e27d5b9616ae52b3303e315a8 Mon Sep 17 00:00:00 2001 From: Mathieu GRENET Date: Wed, 1 Jan 2025 22:00:49 +0100 Subject: [PATCH 01/33] remove obsoletes fixes --- .../Remote/LittleBigMouseClientService.cs | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/LittleBigMouse.Ui/LittleBigMouse.Ui.Avalonia/Remote/LittleBigMouseClientService.cs b/LittleBigMouse.Ui/LittleBigMouse.Ui.Avalonia/Remote/LittleBigMouseClientService.cs index fc781209..2af8d8b2 100644 --- a/LittleBigMouse.Ui/LittleBigMouse.Ui.Avalonia/Remote/LittleBigMouseClientService.cs +++ b/LittleBigMouse.Ui/LittleBigMouse.Ui.Avalonia/Remote/LittleBigMouseClientService.cs @@ -97,23 +97,8 @@ void CreateExcludedFile() { var path = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); var file = Path.Combine(path,"Mgth","LittleBigMouse","Excluded.txt"); - if(File.Exists(file)) - { - // Riot games -> Riot Games (was misspelled in 5.0.4.0) TODO : remove in a version or two - var text = File.ReadAllText(file); - if(text.Contains("\\Riot games\\")) - { - text = text.Replace("\\Riot games\\", "\\Riot Games\\"); - File.WriteAllText(file, text); - } - // SteamLibrary -> steamapps is better for steam games TODO : remove in a version or two - if(text.Contains("\\SteamLibrary\\")) - { - text = text.Replace("\\SteamLibrary\\", "\\steamapps\\"); - File.WriteAllText(file, text); - } - return; - } + if(File.Exists(file)) return; + File.WriteAllText(file, ":Excluded processes\n\\Epic Games\\\n\\steamapps\\\n\\Riot Games\\\n"); } From 1484d07af658c803004c51f330d25ba1cd64125d Mon Sep 17 00:00:00 2001 From: Mathieu GRENET Date: Sun, 12 Jan 2025 21:11:46 +0100 Subject: [PATCH 02/33] Add asp server --- .../DisplayDevice.cs | 35 ++- HLab.Sys/HLab.Sys.Windows.Monitors/Edid.cs | 212 +++++++++--------- .../Factory/MonitorDeviceHelper.cs | 4 +- .../MonitorDevice.cs | 204 ++--------------- .../MonitorDeviceConnection.cs | 188 ++++++++++++++++ .../PhysicalAdapter.cs | 2 + .../LittleBigMouse.DisplayLayout.csproj | 5 +- .../LittleBigMouse.Zoning.csproj | 2 +- .../LittleBigMouse.Hook.vcxproj | 2 +- ...ttleBigMouse.Plugin.Layout.Avalonia.csproj | 2 +- .../LittleBigMouse.Plugin.Vcp.Avalonia.csproj | 2 +- .../LittleBigMouse.Plugins.Avalonia.csproj | 2 +- .../LittleBigMouse.Plugins.csproj | 2 +- .../Controllers/DisplayDeviceController.cs | 24 ++ .../Controllers/WeatherForecastController.cs | 32 +++ .../LittleBigMouse.Server.csproj | 20 ++ .../LittleBigMouse.Server.http | 6 + LittleBigMouse.Server/Program.cs | 103 +++++++++ .../Properties/launchSettings.json | 23 ++ LittleBigMouse.Server/WeatherForecast.cs | 13 ++ .../appsettings.Development.json | 8 + LittleBigMouse.Server/appsettings.json | 9 + .../LittleBigMouse.Ui.Avalonia.csproj | 2 +- .../LittleBigMouse.Ui.Core.csproj | 2 +- LittleBigMouse.sln | 24 ++ 25 files changed, 617 insertions(+), 311 deletions(-) create mode 100644 HLab.Sys/HLab.Sys.Windows.Monitors/MonitorDeviceConnection.cs create mode 100644 LittleBigMouse.Server/Controllers/DisplayDeviceController.cs create mode 100644 LittleBigMouse.Server/Controllers/WeatherForecastController.cs create mode 100644 LittleBigMouse.Server/LittleBigMouse.Server.csproj create mode 100644 LittleBigMouse.Server/LittleBigMouse.Server.http create mode 100644 LittleBigMouse.Server/Program.cs create mode 100644 LittleBigMouse.Server/Properties/launchSettings.json create mode 100644 LittleBigMouse.Server/WeatherForecast.cs create mode 100644 LittleBigMouse.Server/appsettings.Development.json create mode 100644 LittleBigMouse.Server/appsettings.json diff --git a/HLab.Sys/HLab.Sys.Windows.Monitors/DisplayDevice.cs b/HLab.Sys/HLab.Sys.Windows.Monitors/DisplayDevice.cs index 786d6cdb..1a89bf67 100644 --- a/HLab.Sys/HLab.Sys.Windows.Monitors/DisplayDevice.cs +++ b/HLab.Sys/HLab.Sys.Windows.Monitors/DisplayDevice.cs @@ -24,19 +24,31 @@ You should have received a copy of the GNU General Public License using System.Collections.Generic; using System.Linq; using System.Text.Json.Serialization; -using DynamicData; +using System.Xml.Serialization; namespace HLab.Sys.Windows.Monitors; +[XmlInclude(typeof(PhysicalAdapter))] +[XmlInclude(typeof(MonitorDeviceConnection))] public class DisplayDevice { public override string ToString() => $"{GetType().Name} {DeviceName} {DeviceString}"; + [XmlIgnore] readonly List _children = []; - internal void AddChild(DisplayDevice device) + bool IsChildOf(DisplayDevice device) + { + if (Parent == device) return true; + if (Parent == null) return false; + return Parent.IsChildOf(device); + } + + + internal void AddChild(DisplayDevice device) { - _children.Add(device); + if(device.Parent!=this) return; + _children.Add(device); } public IEnumerable AllChildren() where T : DisplayDevice @@ -55,10 +67,15 @@ public IEnumerable AllMonitorDevices() .Select(e => e.First()) .OrderBy(e => e.PhysicalId); + [XmlIgnore] [JsonIgnore] public DisplayDevice? Parent { get; set; } - public IEnumerable Children => _children; + public List Children + { + get => _children; + set => throw new System.NotImplementedException(); + } /// /// Device name as returned by EnumDisplayDevices : @@ -84,21 +101,25 @@ public IEnumerable AllMonitorDevices() /// public string DeviceKey { get; init; } = ""; - public SourceList DisplayModes { get; } = new (); + [XmlIgnore] + public List DisplayModes { get; set; } = new (); /// /// Device mode as returned by EnumDisplaySettingsEx : /// /// + [XmlIgnore] public DisplayMode CurrentMode { get; init; } + [XmlIgnore] public DeviceCaps Capabilities { get; init; } + [XmlIgnore] public DeviceState State { get; init; } public DisplayMode GetBestDisplayMode() { - var best = DisplayModes.Items.FirstOrDefault(); - foreach (var mode in DisplayModes.Items) + var best = DisplayModes.FirstOrDefault(); + foreach (var mode in DisplayModes) { if (mode.BitsPerPixel < best.BitsPerPixel) continue; if (mode.DisplayFrequency < best.DisplayFrequency) continue; diff --git a/HLab.Sys/HLab.Sys.Windows.Monitors/Edid.cs b/HLab.Sys/HLab.Sys.Windows.Monitors/Edid.cs index 6ddf55d3..09312d44 100644 --- a/HLab.Sys/HLab.Sys.Windows.Monitors/Edid.cs +++ b/HLab.Sys/HLab.Sys.Windows.Monitors/Edid.cs @@ -22,6 +22,7 @@ You should have received a copy of the GNU General Public License */ using Avalonia; +using System; using System.Runtime.Serialization; namespace HLab.Sys.Windows.Monitors; @@ -66,45 +67,47 @@ public interface IEdid int Checksum { get; } } - -public class Edid : IEdid +public static class EdidParser { - public Edid(string key, byte[] edid) + public static Edid Parse(string key, byte[] edid) { - HKeyName = key; + var e = new Edid + { + HKeyName = key + }; - if (edid.Length <= 9) return; + if (edid.Length <= 9) return e; - ManufacturerCode = "" + (char)(64 + ((edid[8] >> 2) & 0x1F)) + e.ManufacturerCode = "" + (char)(64 + ((edid[8] >> 2) & 0x1F)) + (char)(64 + (((edid[8] << 3) | (edid[9] >> 5)) & 0x1F)) + (char)(64 + (edid[9] & 0x1F)); - if (edid.Length <= 11) return; + if (edid.Length <= 11) return e; - ProductCode = (edid[10] + (edid[11] << 8)).ToString("X4"); + e.ProductCode = (edid[10] + (edid[11] << 8)).ToString("X4"); - if (edid.Length <= 15) return; + if (edid.Length <= 15) return e; var serial = ""; for (var i = 12; i <= 15; i++) serial = edid[i].ToString("X2") + serial; - Serial = serial; + e.Serial = serial; - if (edid.Length <= 16) return; - Week = edid[16]; + if (edid.Length <= 16) return e; + e.Week = edid[16]; - if (edid.Length < 18) return; - Year = edid[17] + 1990; + if (edid.Length < 18) return e; + e.Year = edid[17] + 1990; - if (edid.Length <= 19) return; - Version = edid[18] + "." + edid[19]; + if (edid.Length <= 19) return e; + e.Version = edid[18] + "." + edid[19]; - if (edid.Length <= 20) return; + if (edid.Length <= 20) return e; - Digital = (edid[20] >> 7) == 1; - if (Digital) + e.Digital = (edid[20] >> 7) == 1; + if (e.Digital) { - BitDepth = 4 + ((edid[20] & 0b01110000) >> 3); - VideoInterface = (edid[20] & 0b1111) switch + e.BitDepth = 4 + ((edid[20] & 0b01110000) >> 3); + e.VideoInterface = (edid[20] & 0b1111) switch { 0 => "undefined", 2 => "HDMIa", @@ -119,42 +122,41 @@ public Edid(string key, byte[] edid) { } - if (edid.Length <= 21) return; + if (edid.Length <= 21) return e; - var h = edid[21] * 10; + e.PhysicalWidth = edid[21] * 10; - if (edid.Length <= 22) return; + if (edid.Length <= 22) return e; - var v = edid[22] * 10; + e.PhysicalHeight = edid[22] * 10; - PhysicalSize = new Size(h, v); - if (edid.Length <= 23) return; + if (edid.Length <= 23) return e; if (edid[23] < 255) { - Gamma = 1.0 + edid[23] / 100.0; + e.Gamma = 1.0 + edid[23] / 100.0; } else { // todo : else check DI-EXT block } - if (edid.Length <= 24) return; - DpmsStandbySupported = (edid[24] & (0b1 << 7)) > 0; - DpmsSuspendSupported = (edid[24] & (0b1 << 6)) > 0; - DpmsActiveOffSupported = (edid[24] & (0b1 << 5)) > 0; + if (edid.Length <= 24) return e; + e.DpmsStandbySupported = (edid[24] & (0b1 << 7)) > 0; + e.DpmsSuspendSupported = (edid[24] & (0b1 << 6)) > 0; + e.DpmsActiveOffSupported = (edid[24] & (0b1 << 5)) > 0; - if (Digital) + if (e.Digital) { - YCrCb422Support = (edid[24] & (0b1 << 4)) > 0; - YCrCb444Support = (edid[24] & (0b1 << 3)) > 0; + e.YCrCb422Support = (edid[24] & (0b1 << 4)) > 0; + e.YCrCb444Support = (edid[24] & (0b1 << 3)) > 0; } else { // todo : analog display } - if (edid.Length <= 34) return; + if (edid.Length <= 34) return e; if ((edid[24] & (0b1 << 2)) > 0) { @@ -168,111 +170,115 @@ public Edid(string key, byte[] edid) var whiteX = ((edid[26] >> 2) & 0b11) | (((int)edid[33]) << 2); var whiteY = (edid[26] & 0b11) | (((int)edid[34]) << 2); - RedX = ((double)redX) / 1024.0; - RedY = ((double)redY) / 1024.0; - GreenX = ((double)greenX) / 1024.0; - GreenY = ((double)greenY) / 1024.0; - BlueX = ((double)blueX) / 1024.0; - BlueY = ((double)blueY) / 1024.0; - WhiteX = ((double)whiteX) / 1024.0; - WhiteY = ((double)whiteY) / 1024.0; + e.RedX = ((double)redX) / 1024.0; + e.RedY = ((double)redY) / 1024.0; + e.GreenX = ((double)greenX) / 1024.0; + e.GreenY = ((double)greenY) / 1024.0; + e.BlueX = ((double)blueX) / 1024.0; + e.BlueY = ((double)blueY) / 1024.0; + e.WhiteX = ((double)whiteX) / 1024.0; + e.WhiteY = ((double)whiteY) / 1024.0; } - if (edid.Length <= 68) return; - - PhysicalSize = new Size( - ((edid[68] & 0xF0) << 4) + edid[66], - ((edid[68] & 0x0F) << 8) + edid[67] - ); + if (edid.Length <= 68) return e; - Model = Block((char)0xFC, edid); + e.PhysicalWidth = ((edid[68] & 0xF0) << 4) + edid[66]; + e.PhysicalHeight = ((edid[68] & 0x0F) << 8) + edid[67]; - SerialNumber = Block((char)0xFF, edid); + e.Model = Block((char)0xFC, edid); - if (edid.Length <= 127) return; - Checksum = edid[127]; + e.SerialNumber = Block((char)0xFF, edid); + if (edid.Length <= 127) return e; + e.Checksum = edid[127]; + return e; + } + static string Block(char code, byte[] edid) + { + for (var i = 54; i <= 108; i += 18) + { + if (i >= edid.Length || edid[i] != 0 || edid[i + 1] != 0 || edid[i + 2] != 0 || + edid[i + 3] != code) continue; + var s = ""; + for (var j = i + 5; j < i + 18; j++) + { + var c = (char)edid[j]; + if (c == (char)0x0A) break; + if (c == (char)0x00) break; + s += c; + } + return s; + } + return ""; } + +} + + +public class Edid +{ [DataMember] - public string HKeyName { get; } + public string HKeyName { get; set; } [DataMember] - public string ProductCode { get; } + public string ProductCode { get; set; } [DataMember] - public string Serial { get; } + public string Serial { get; set; } [DataMember] - public Size PhysicalSize { get; } + public double PhysicalWidth { get; set; } [DataMember] - public string ManufacturerCode { get; } + public double PhysicalHeight { get; set; } [DataMember] - public string Model { get; } + public string ManufacturerCode { get; set; } [DataMember] - public string SerialNumber { get; } + public string Model { get; set; } [DataMember] - public int Week { get; } + public string SerialNumber { get; set; } [DataMember] - public int Year { get; } + public int Week { get; set; } [DataMember] - public string Version { get; } + public int Year { get; set; } [DataMember] - public bool Digital { get; } + public string Version { get; set; } + [DataMember] + public bool Digital { get; set; } [DataMember] - public int BitDepth { get; } + public int BitDepth { get; set; } [DataMember] - public string VideoInterface { get; } + public string VideoInterface { get; set; } [DataMember] - public double Gamma { get; } + public double Gamma { get; set; } [DataMember] - public bool DpmsStandbySupported { get; } + public bool DpmsStandbySupported { get; set; } [DataMember] - public bool DpmsSuspendSupported { get; } + public bool DpmsSuspendSupported { get; set; } [DataMember] - public bool DpmsActiveOffSupported { get; } + public bool DpmsActiveOffSupported { get; set; } [DataMember] - public bool YCrCb444Support { get; } + public bool YCrCb444Support { get; set; } [DataMember] - public bool YCrCb422Support { get; } + public bool YCrCb422Support { get; set; } [DataMember] - public double sRGB { get; } + public double sRGB { get; set; } [DataMember] - public double RedX { get; } + public double RedX { get; set; } [DataMember] - public double RedY { get; } + public double RedY { get; set; } [DataMember] - public double GreenX { get; } + public double GreenX { get; set; } [DataMember] - public double GreenY { get; } + public double GreenY { get; set; } [DataMember] - public double BlueX { get; } + public double BlueX { get; set; } [DataMember] - public double BlueY { get; } + public double BlueY { get ; set; } [DataMember] - public double WhiteX { get; } + public double WhiteX { get; set; } [DataMember] - public double WhiteY { get; } + public double WhiteY { get; set; } [DataMember] - public int Checksum { get; } - - static string Block(char code, byte[] edid) - { - for (var i = 54; i <= 108; i += 18) - { - if (i >= edid.Length || edid[i] != 0 || edid[i + 1] != 0 || edid[i + 2] != 0 || - edid[i + 3] != code) continue; - var s = ""; - for (var j = i + 5; j < i + 18; j++) - { - var c = (char)edid[j]; - if (c == (char)0x0A) break; - if (c == (char)0x00) break; - s += c; - } - return s; - } - return ""; - } - + public int Checksum { get; set; } } \ No newline at end of file diff --git a/HLab.Sys/HLab.Sys.Windows.Monitors/Factory/MonitorDeviceHelper.cs b/HLab.Sys/HLab.Sys.Windows.Monitors/Factory/MonitorDeviceHelper.cs index 67152838..41321235 100644 --- a/HLab.Sys/HLab.Sys.Windows.Monitors/Factory/MonitorDeviceHelper.cs +++ b/HLab.Sys/HLab.Sys.Windows.Monitors/Factory/MonitorDeviceHelper.cs @@ -282,7 +282,7 @@ public static string GetSourceId(string deviceId, Edid edid) : $"{pnpCode}{edid.SerialNumber}_{edid.Week:X2}_{edid.Year:X4}_{edid.Checksum:X2}"; } - public static Edid GetEdid(string deviceId) + public static Edid? GetEdid(string deviceId) { var devInfo = SetupDiGetClassDevsEx( ref GUID_CLASS_MONITOR, //class GUID @@ -330,7 +330,7 @@ public static Edid GetEdid(string deviceId) using var keyEdid = RegistryKey(hEdidRegKey); var edid = (byte[])keyEdid.GetValue("EDID"); - return edid != null ? new Edid(hKeyName, edid) : null; + return edid != null ? EdidParser.Parse(hKeyName, edid) : null; } } } diff --git a/HLab.Sys/HLab.Sys.Windows.Monitors/MonitorDevice.cs b/HLab.Sys/HLab.Sys.Windows.Monitors/MonitorDevice.cs index b8a4df45..7f25f480 100644 --- a/HLab.Sys/HLab.Sys.Windows.Monitors/MonitorDevice.cs +++ b/HLab.Sys/HLab.Sys.Windows.Monitors/MonitorDevice.cs @@ -1,200 +1,28 @@ using System; using System.Collections.Generic; -using System.Diagnostics; -using System.Globalization; -using System.Runtime.Serialization; -using Avalonia; -using Avalonia.Controls; -using Microsoft.Win32; +using System.Xml.Serialization; namespace HLab.Sys.Windows.Monitors; public class MonitorDevice : IEquatable { - [DataMember] public string Id { get; init; } = ""; - [DataMember] public string PnpCode { get; init; } = ""; - [DataMember] public string PhysicalId { get; set; } = ""; - [DataMember] public string SourceId { get; set; } = ""; - [DataMember] public IEdid Edid { get; init; } - [DataMember] public string MonitorNumber { get; set; } = ""; + public string Id { get; init; } = ""; + public string PnpCode { get; init; } = ""; + public string PhysicalId { get; set; } = ""; + public string SourceId { get; set; } = ""; + public Edid Edid { get; set; } + public string MonitorNumber { get; set; } = ""; - public List Connections = new (); + [XmlIgnore] + public List Connections = new(); - public override bool Equals(object obj) - { - if(obj is MonitorDevice other) return Id == other.Id; - return base.Equals(obj); - } + public override bool Equals(object obj) + { + if (obj is MonitorDevice other) return Id == other.Id; + return base.Equals(obj); + } - public override int GetHashCode() => HashCode.Combine(Id); - - public bool Equals(MonitorDevice other) => Id == other.Id; -} - -public class MonitorDeviceConnection : DisplayDevice -{ - public new PhysicalAdapter Parent - { - get { - if (base.Parent is PhysicalAdapter adapter) return adapter; - throw new InvalidOperationException("Parent is not a PhysicalAdapter"); - } - set => base.Parent = value; - } - - public MonitorDevice Monitor { get; set; } - - class EdidDesign : IEdid - { - public EdidDesign() - { - if(!Design.IsDesignMode) throw new InvalidOperationException("Only for design mode"); - } - - public string HKeyName => "HKLM://"; - public string ManufacturerCode => "SAM"; - public string ProductCode { get; } - public string Serial { get; } - public int Week => 42; - public int Year { get; } - public string Version { get; } - public bool Digital { get; } - public int BitDepth { get; } - public string VideoInterface { get; } - public Size PhysicalSize => new Size(600, 340); - public string Model => "S24D300"; - public string SerialNumber => "S/N: 123456789"; - public double Gamma => 2.2; - public bool DpmsStandbySupported => true; - public bool DpmsSuspendSupported => true; - public bool DpmsActiveOffSupported => true; - public bool YCrCb444Support => true; - public bool YCrCb422Support => true; - public double sRGB => 0.98; - public double RedX => 0.64; - public double RedY => 0.33; - public double GreenX => 0.3; - public double GreenY => 0.6; - public double BlueX => 0.15; - public double BlueY => 0.06; - public double WhiteX => 0.3127; - public double WhiteY => 0.3127; - public int Checksum => int.MinValue; - } - - public static MonitorDeviceConnection MonitorDesign - { - get - { - if(!Design.IsDesignMode) throw new InvalidOperationException("Only for design mode"); - - return new MonitorDeviceConnection - { - //Edid = new EdidDesign() - }; - } - } - - //------------------------------------------------------------------------ - public override bool Equals(object obj) => obj is MonitorDeviceConnection other ? Id == other.Id : base.Equals(obj); - - - public override int GetHashCode() { - return ("DisplayMonitor" + Id).GetHashCode(); - } - - void OpenRegKey(string keyString) { - - keyString = keyString.Replace(@"\MACHINE\",@"\HKEY_LOCAL_MACHINE\"); - keyString = keyString.Replace(@"\USER\",@"\HKEY_CURRENT_USER\"); - - using (var key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Applets\Regedit", true)) { - - if(key == null) return; - var value = key.GetValue("LastKey").ToString(); - - var list = value.Split('\\'); - if(list.Length > 0) - { - keyString = keyString.Replace(@"\REGISTRY\",@$"{list[0]}\"); - key.SetValue("LastKey", keyString); - } - } - - Process.Start("regedit.exe"); - } - - - public void DisplayValues(Action addValue) { - //addValue("Registry", Edid.HKeyName, () => { OpenRegKey(Edid.HKeyName); }, false); - //addValue("Microsoft Id", PhysicalId, null, false); - - if(Parent != null) - { - // EnumDisplaySettings - addValue("", "EnumDisplaySettings", null, true); - addValue("DisplayOrientation", Parent.CurrentMode?.DisplayOrientation.ToString() ?? "", null, false); - addValue("Position", Parent.CurrentMode?.Position.ToString() ?? "", null, false); - addValue("Pels", Parent.CurrentMode?.Pels.ToString() ?? "", null, false); - addValue("BitsPerPixel", Parent.CurrentMode?.BitsPerPixel.ToString() ?? "", null, false); - addValue("DisplayFrequency", Parent.CurrentMode?.DisplayFrequency.ToString() ?? "", null, false); - addValue("DisplayFlags", Parent.CurrentMode?.DisplayFlags.ToString() ?? "", null, false); - addValue("DisplayFixedOutput", Parent.CurrentMode?.DisplayFixedOutput.ToString() ?? "", null, false); - - // GetDeviceCaps - addValue("", "GetDeviceCaps", null, true); - addValue("Size", Parent.Capabilities.Size.ToString(), null, false); - addValue("Res", Parent.Capabilities.Resolution.ToString(), null, false); - addValue("LogPixels", Parent.Capabilities.LogPixels.ToString(), null, false); - addValue("BitsPixel", Parent.Capabilities.BitsPixel.ToString(), null, false); - //AddValue("Color Planes", Monitor.Adapter.DeviceCaps.Planes.ToString()); - addValue("Aspect", Parent.Capabilities.Aspect.ToString(), null, false); - //AddValue("BltAlignment", Monitor.Adapter.DeviceCaps.BltAlignment.ToString()); - - //GetDpiForMonitor - addValue("", "GetDpiForMonitor", null, true); - addValue("EffectiveDpi", Parent.EffectiveDpi.ToString(), null, false); - addValue("AngularDpi", Parent.AngularDpi.ToString(), null, false); - addValue("RawDpi", Parent.RawDpi.ToString(), null, false); - - // GetMonitorInfo - addValue("", "GetMonitorInfo", null, true); - addValue("Primary", Parent.Primary.ToString(), null, false); - addValue("MonitorArea", Parent.MonitorArea.ToString(), null, false); - addValue("WorkArea", Parent.WorkArea.ToString(), null, false); - - - //// EDID - //addValue("", "EDID", null, true); - //addValue("ManufacturerCode", Edid?.ManufacturerCode, null, false); - //addValue("ProductCode", Edid?.ProductCode, null, false); - //addValue("Serial", Edid?.Serial, null, false); - //addValue("Model", Edid?.Model, null, false); - //addValue("SerialNo", Edid?.SerialNumber, null, false); - //addValue("SizeInMm", Edid?.PhysicalSize.ToString(), null, false); - //addValue("VideoInterface", Edid?.VideoInterface.ToString(), null, false); - - // GetScaleFactorForMonitor - addValue("", "GetScaleFactorForMonitor", null, true); - addValue("ScaleFactor", Parent.ScaleFactor.ToString(CultureInfo.CurrentCulture) ?? "", null, false); - - // EnumDisplayDevices - addValue("", "EnumDisplayDevices", null, true); - addValue("DeviceId", Parent.Id, null, false); - addValue("DeviceKey", Parent.DeviceKey, null, false); - addValue("DeviceString", Parent.DeviceString, null, false); - addValue("DeviceName", Parent.DeviceName, null, false); - addValue("StateFlags", Parent.State.ToString(), null, false); - } - - addValue("", "EnumDisplayDevices", null, true); - addValue("DeviceId", Id, null, false); - addValue("DeviceKey", DeviceKey, null, false); - addValue("DeviceString", DeviceString, null, false); - addValue("DeviceName", DeviceName, null, false); - addValue("StateFlags", State.ToString(), null, false); - - } - public override string ToString() => DeviceString; + public override int GetHashCode() => HashCode.Combine(Id); + public bool Equals(MonitorDevice other) => Id == other.Id; } \ No newline at end of file diff --git a/HLab.Sys/HLab.Sys.Windows.Monitors/MonitorDeviceConnection.cs b/HLab.Sys/HLab.Sys.Windows.Monitors/MonitorDeviceConnection.cs new file mode 100644 index 00000000..54288014 --- /dev/null +++ b/HLab.Sys/HLab.Sys.Windows.Monitors/MonitorDeviceConnection.cs @@ -0,0 +1,188 @@ +using System; +using System.Diagnostics; +using System.Globalization; +using System.Xml.Serialization; +using Avalonia; +using Avalonia.Controls; +using Microsoft.Win32; + +namespace HLab.Sys.Windows.Monitors; + +public class MonitorDeviceConnection : DisplayDevice +{ + [XmlIgnore] + public new PhysicalAdapter Parent + { + get + { + if (base.Parent is PhysicalAdapter adapter) return adapter; + throw new InvalidOperationException("Parent is not a PhysicalAdapter"); + } + set => base.Parent = value; + } + + public MonitorDevice Monitor { get; set; } + + class EdidDesign : Edid + { + public EdidDesign() + { + if (!Design.IsDesignMode) throw new InvalidOperationException("Only for design mode"); + HKeyName = "HKLM://"; + ManufacturerCode = "SAM"; + ProductCode = "S24D300"; + Serial= "123456789"; + Week = 42; + Year = 2024; + Version = "1.0"; + Digital = true; + BitDepth = 8; + VideoInterface = "Dvi"; + PhysicalWidth = 600; + PhysicalHeight = 340; + Model = "S24D300"; + SerialNumber = "S/N: 123456789"; + Gamma = 2.2; + DpmsStandbySupported = true; + DpmsSuspendSupported = true; + DpmsActiveOffSupported = true; + YCrCb444Support = true; + YCrCb422Support = true; + sRGB = 0.98; + RedX = 0.64; + RedY = 0.33; + GreenX = 0.3; + GreenY = 0.6; + BlueX = 0.15; + BlueY = 0.06; + WhiteX = 0.3127; + WhiteY = 0.3127; + Checksum = int.MinValue; + } + + } + + public static MonitorDeviceConnection MonitorDesign + { + get + { + if (!Design.IsDesignMode) throw new InvalidOperationException("Only for design mode"); + + return new MonitorDeviceConnection + { + Monitor = new MonitorDevice + { + Edid = new EdidDesign() + }, + }; + } + } + + //------------------------------------------------------------------------ + public override bool Equals(object obj) => obj is MonitorDeviceConnection other ? Id == other.Id : base.Equals(obj); + + + public override int GetHashCode() + { + return ("DisplayMonitor" + Id).GetHashCode(); + } + + void OpenRegKey(string keyString) + { + + keyString = keyString.Replace(@"\MACHINE\", @"\HKEY_LOCAL_MACHINE\"); + keyString = keyString.Replace(@"\USER\", @"\HKEY_CURRENT_USER\"); + + using (var key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Applets\Regedit", true)) + { + + if (key == null) return; + var value = key.GetValue("LastKey").ToString(); + + var list = value.Split('\\'); + if (list.Length > 0) + { + keyString = keyString.Replace(@"\REGISTRY\", @$"{list[0]}\"); + key.SetValue("LastKey", keyString); + } + } + + Process.Start("regedit.exe"); + } + + + public void DisplayValues(Action addValue) + { + //addValue("Registry", Edid.HKeyName, () => { OpenRegKey(Edid.HKeyName); }, false); + //addValue("Microsoft Id", PhysicalId, null, false); + + if (Parent != null) + { + // EnumDisplaySettings + addValue("", "EnumDisplaySettings", null, true); + addValue("DisplayOrientation", Parent.CurrentMode?.DisplayOrientation.ToString() ?? "", null, false); + addValue("Position", Parent.CurrentMode?.Position.ToString() ?? "", null, false); + addValue("Pels", Parent.CurrentMode?.Pels.ToString() ?? "", null, false); + addValue("BitsPerPixel", Parent.CurrentMode?.BitsPerPixel.ToString() ?? "", null, false); + addValue("DisplayFrequency", Parent.CurrentMode?.DisplayFrequency.ToString() ?? "", null, false); + addValue("DisplayFlags", Parent.CurrentMode?.DisplayFlags.ToString() ?? "", null, false); + addValue("DisplayFixedOutput", Parent.CurrentMode?.DisplayFixedOutput.ToString() ?? "", null, false); + + // GetDeviceCaps + addValue("", "GetDeviceCaps", null, true); + addValue("Size", Parent.Capabilities.Size.ToString(), null, false); + addValue("Res", Parent.Capabilities.Resolution.ToString(), null, false); + addValue("LogPixels", Parent.Capabilities.LogPixels.ToString(), null, false); + addValue("BitsPixel", Parent.Capabilities.BitsPixel.ToString(), null, false); + //AddValue("Color Planes", Monitor.Adapter.DeviceCaps.Planes.ToString()); + addValue("Aspect", Parent.Capabilities.Aspect.ToString(), null, false); + //AddValue("BltAlignment", Monitor.Adapter.DeviceCaps.BltAlignment.ToString()); + + //GetDpiForMonitor + addValue("", "GetDpiForMonitor", null, true); + addValue("EffectiveDpi", Parent.EffectiveDpi.ToString(), null, false); + addValue("AngularDpi", Parent.AngularDpi.ToString(), null, false); + addValue("RawDpi", Parent.RawDpi.ToString(), null, false); + + // GetMonitorInfo + addValue("", "GetMonitorInfo", null, true); + addValue("Primary", Parent.Primary.ToString(), null, false); + addValue("MonitorArea", Parent.MonitorArea.ToString(), null, false); + addValue("WorkArea", Parent.WorkArea.ToString(), null, false); + + + //// EDID + addValue("", "EDID", null, true); + addValue("ManufacturerCode", Monitor?.Edid?.ManufacturerCode, null, false); + addValue("ProductCode", Monitor?.Edid?.ProductCode, null, false); + addValue("Serial", Monitor?.Edid?.Serial, null, false); + addValue("Model", Monitor?.Edid?.Model, null, false); + addValue("SerialNo", Monitor?.Edid?.SerialNumber, null, false); + addValue("SizeInMm H", Monitor?.Edid?.PhysicalWidth.ToString(), null, false); + addValue("SizeInMm V", Monitor?.Edid?.PhysicalHeight.ToString(), null, false); + addValue("VideoInterface", Monitor?.Edid?.VideoInterface.ToString(), null, false); + + // GetScaleFactorForMonitor + addValue("", "GetScaleFactorForMonitor", null, true); + addValue("ScaleFactor", Parent.ScaleFactor.ToString(CultureInfo.CurrentCulture) ?? "", null, false); + + // EnumDisplayDevices + addValue("", "EnumDisplayDevices", null, true); + addValue("DeviceId", Parent.Id, null, false); + addValue("DeviceKey", Parent.DeviceKey, null, false); + addValue("DeviceString", Parent.DeviceString, null, false); + addValue("DeviceName", Parent.DeviceName, null, false); + addValue("StateFlags", Parent.State.ToString(), null, false); + } + + addValue("", "EnumDisplayDevices", null, true); + addValue("DeviceId", Id, null, false); + addValue("DeviceKey", DeviceKey, null, false); + addValue("DeviceString", DeviceString, null, false); + addValue("DeviceName", DeviceName, null, false); + addValue("StateFlags", State.ToString(), null, false); + + } + public override string ToString() => DeviceString; + +} \ No newline at end of file diff --git a/HLab.Sys/HLab.Sys.Windows.Monitors/PhysicalAdapter.cs b/HLab.Sys/HLab.Sys.Windows.Monitors/PhysicalAdapter.cs index 3e419a04..fbbdef0b 100644 --- a/HLab.Sys/HLab.Sys.Windows.Monitors/PhysicalAdapter.cs +++ b/HLab.Sys/HLab.Sys.Windows.Monitors/PhysicalAdapter.cs @@ -1,11 +1,13 @@ using Avalonia; using System.Runtime.Serialization; using HLab.Sys.Windows.API; +using System.Xml.Serialization; namespace HLab.Sys.Windows.Monitors; public class PhysicalAdapter : DisplayDevice { + [XmlIgnore] public nint HMonitor { get; set; } // MONITORINFOEX diff --git a/LittleBigMouse.Core/LittleBigMouse.DisplayLayout/LittleBigMouse.DisplayLayout.csproj b/LittleBigMouse.Core/LittleBigMouse.DisplayLayout/LittleBigMouse.DisplayLayout.csproj index 41fbfe3d..798bf99d 100644 --- a/LittleBigMouse.Core/LittleBigMouse.DisplayLayout/LittleBigMouse.DisplayLayout.csproj +++ b/LittleBigMouse.Core/LittleBigMouse.DisplayLayout/LittleBigMouse.DisplayLayout.csproj @@ -5,14 +5,13 @@ x64;x86;AnyCpu Library Debug;Release;ReleaseDebug - 5.2.4.0 + 5.3.0.0 - - + diff --git a/LittleBigMouse.Core/LittleBigMouse.Zones/LittleBigMouse.Zoning.csproj b/LittleBigMouse.Core/LittleBigMouse.Zones/LittleBigMouse.Zoning.csproj index af2cfa9d..cd876b34 100644 --- a/LittleBigMouse.Core/LittleBigMouse.Zones/LittleBigMouse.Zoning.csproj +++ b/LittleBigMouse.Core/LittleBigMouse.Zones/LittleBigMouse.Zoning.csproj @@ -5,7 +5,7 @@ enable enable AnyCPU;x64;x86 - 5.2.4.0 + 5.3.0.0 diff --git a/LittleBigMouse.Hook/LittleBigMouse.Hook.vcxproj b/LittleBigMouse.Hook/LittleBigMouse.Hook.vcxproj index b17e7183..7ff9f5b8 100644 --- a/LittleBigMouse.Hook/LittleBigMouse.Hook.vcxproj +++ b/LittleBigMouse.Hook/LittleBigMouse.Hook.vcxproj @@ -193,7 +193,7 @@ _DEBUG_;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true true - $(ProjectDir) + $(ProjectDir);C:\boost_1_87_0 stdcpp20 stdc17 diff --git a/LittleBigMouse.Plugins/LittleBigMouse.Plugin.Layout.Avalonia/LittleBigMouse.Plugin.Layout.Avalonia.csproj b/LittleBigMouse.Plugins/LittleBigMouse.Plugin.Layout.Avalonia/LittleBigMouse.Plugin.Layout.Avalonia.csproj index 76a4b690..b657b8de 100644 --- a/LittleBigMouse.Plugins/LittleBigMouse.Plugin.Layout.Avalonia/LittleBigMouse.Plugin.Layout.Avalonia.csproj +++ b/LittleBigMouse.Plugins/LittleBigMouse.Plugin.Layout.Avalonia/LittleBigMouse.Plugin.Layout.Avalonia.csproj @@ -7,7 +7,7 @@ x64;x86;AnyCpu true preview - 5.2.4.0 + 5.3.0.0 diff --git a/LittleBigMouse.Plugins/LittleBigMouse.Plugin.Vcp.Avalonia/LittleBigMouse.Plugin.Vcp.Avalonia.csproj b/LittleBigMouse.Plugins/LittleBigMouse.Plugin.Vcp.Avalonia/LittleBigMouse.Plugin.Vcp.Avalonia.csproj index def3d1ae..a2805117 100644 --- a/LittleBigMouse.Plugins/LittleBigMouse.Plugin.Vcp.Avalonia/LittleBigMouse.Plugin.Vcp.Avalonia.csproj +++ b/LittleBigMouse.Plugins/LittleBigMouse.Plugin.Vcp.Avalonia/LittleBigMouse.Plugin.Vcp.Avalonia.csproj @@ -7,7 +7,7 @@ AnyCPU;x64;x86 preview true - 5.2.4.0 + 5.3.0.0 diff --git a/LittleBigMouse.Plugins/LittleBigMouse.Plugins.Avalonia/LittleBigMouse.Plugins.Avalonia.csproj b/LittleBigMouse.Plugins/LittleBigMouse.Plugins.Avalonia/LittleBigMouse.Plugins.Avalonia.csproj index 9848f862..1729f1a3 100644 --- a/LittleBigMouse.Plugins/LittleBigMouse.Plugins.Avalonia/LittleBigMouse.Plugins.Avalonia.csproj +++ b/LittleBigMouse.Plugins/LittleBigMouse.Plugins.Avalonia/LittleBigMouse.Plugins.Avalonia.csproj @@ -4,7 +4,7 @@ net8.0 enable x64;x86;AnyCpu - 5.2.4.0 + 5.3.0.0 true diff --git a/LittleBigMouse.Plugins/LittleBigMouse.Plugins.Core/LittleBigMouse.Plugins.csproj b/LittleBigMouse.Plugins/LittleBigMouse.Plugins.Core/LittleBigMouse.Plugins.csproj index 5f1d7578..aff96032 100644 --- a/LittleBigMouse.Plugins/LittleBigMouse.Plugins.Core/LittleBigMouse.Plugins.csproj +++ b/LittleBigMouse.Plugins/LittleBigMouse.Plugins.Core/LittleBigMouse.Plugins.csproj @@ -5,7 +5,7 @@ enable enable x64;x86;AnyCpu - 5.2.4.0 + 5.3.0.0 diff --git a/LittleBigMouse.Server/Controllers/DisplayDeviceController.cs b/LittleBigMouse.Server/Controllers/DisplayDeviceController.cs new file mode 100644 index 00000000..f4ba68e0 --- /dev/null +++ b/LittleBigMouse.Server/Controllers/DisplayDeviceController.cs @@ -0,0 +1,24 @@ +using HLab.Sys.Windows.Monitors; +using HLab.Sys.Windows.Monitors.Factory; +using Microsoft.AspNetCore.Mvc; + +namespace LittleBigMouse.Server.Controllers; + +[ApiController] +[Route("[controller]")] +public class DisplayDeviceController : ControllerBase +{ + private readonly ILogger _logger; + + public DisplayDeviceController(ILogger logger) + { + _logger = logger; + } + + [HttpGet(Name = "GetDisplayDevice")] + [Produces("application/xml")] + public DisplayDevice Get() + { + return MonitorDeviceHelper.GetDisplayDevices(); + } +} \ No newline at end of file diff --git a/LittleBigMouse.Server/Controllers/WeatherForecastController.cs b/LittleBigMouse.Server/Controllers/WeatherForecastController.cs new file mode 100644 index 00000000..97635477 --- /dev/null +++ b/LittleBigMouse.Server/Controllers/WeatherForecastController.cs @@ -0,0 +1,32 @@ +using Microsoft.AspNetCore.Mvc; + +namespace LittleBigMouse.Server.Controllers; + +[ApiController] +[Route("[controller]")] +public class WeatherForecastController : ControllerBase +{ + private static readonly string[] Summaries = new[] + { + "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" + }; + + private readonly ILogger _logger; + + public WeatherForecastController(ILogger logger) + { + _logger = logger; + } + + [HttpGet(Name = "GetWeatherForecast")] + public IEnumerable Get() + { + return Enumerable.Range(1, 5).Select(index => new WeatherForecast + { + Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)), + TemperatureC = Random.Shared.Next(-20, 55), + Summary = Summaries[Random.Shared.Next(Summaries.Length)] + }) + .ToArray(); + } +} \ No newline at end of file diff --git a/LittleBigMouse.Server/LittleBigMouse.Server.csproj b/LittleBigMouse.Server/LittleBigMouse.Server.csproj new file mode 100644 index 00000000..1cd5c7c0 --- /dev/null +++ b/LittleBigMouse.Server/LittleBigMouse.Server.csproj @@ -0,0 +1,20 @@ + + + + net9.0 + enable + enable + + + + + + + + + + + + + + diff --git a/LittleBigMouse.Server/LittleBigMouse.Server.http b/LittleBigMouse.Server/LittleBigMouse.Server.http new file mode 100644 index 00000000..e1d60d04 --- /dev/null +++ b/LittleBigMouse.Server/LittleBigMouse.Server.http @@ -0,0 +1,6 @@ +@LittleBigMouse.Server_HostAddress = http://localhost:5021 + +GET {{LittleBigMouse.Server_HostAddress}}/weatherforecast/ +Accept: application/json + +### diff --git a/LittleBigMouse.Server/Program.cs b/LittleBigMouse.Server/Program.cs new file mode 100644 index 00000000..f7d4fe8f --- /dev/null +++ b/LittleBigMouse.Server/Program.cs @@ -0,0 +1,103 @@ +using System.Text; +using ExtendedXmlSerializer; +using ExtendedXmlSerializer.Configuration; +using Microsoft.AspNetCore.Mvc.Formatters; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Net.Http.Headers; + +var builder = WebApplication.CreateBuilder(args); + +// Configurer les options de Kestrel pour augmenter la taille du tampon de réponse +builder.WebHost.ConfigureKestrel(options => +{ + options.Limits.MaxResponseBufferSize = 104857600; // 100 Mo +}); + +builder.Services.Configure(options => +{ + options.BufferBody = true; + options.MemoryBufferThreshold = 104857600; // 100 Mo +}); + + + +// Add services to the container. + +builder.Services.AddControllers(options => +{ + options.OutputFormatters.Clear(); + //options.OutputFormatters.Insert(0, new XmlSerializerOutputFormatter()); + //options.FormatterMappings.SetMediaTypeMappingForFormat("xml", "application/xml"); + //options.FormatterMappings.SetMediaTypeMappingForFormat("default", "application/xml"); + //options.FormatterMappings.SetMediaTypeMappingForFormat("text/html", "application/xml"); + //options.OutputFormatters.Add(new ExtendedXmlSerializerOutputFormatter()); +}) +//.AddJsonOptions(options => +//{ +// options.JsonSerializerOptions.NumberHandling = System.Text.Json.Serialization.JsonNumberHandling.AllowNamedFloatingPointLiterals; +//}) + + .AddXmlSerializerFormatters();// Ajout du formatteur XML +; +// Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi +builder.Services.AddOpenApi(); + +var app = builder.Build(); + +// Configure the HTTP request pipeline. +if (app.Environment.IsDevelopment()) +{ + app.MapOpenApi(); +} + +app.UseHttpsRedirection(); + +app.UseAuthorization(); + +app.MapControllers(); + +app.Run(); + + +public class ExtendedXmlSerializerOutputFormatter : TextOutputFormatter +{ + private readonly IExtendedXmlSerializer _serializer; + + public ExtendedXmlSerializerOutputFormatter() + { + _serializer = new ConfigurationContainer().EnableReferences().Create(); + + SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("application/xml")); + SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("text/xml")); + + SupportedEncodings.Add(Encoding.UTF8); + SupportedEncodings.Add(Encoding.Unicode); + } + + protected override bool CanWriteType(Type type) + { + if (type == null) + { + throw new ArgumentNullException(nameof(type)); + } + + return true; + } + + public override async Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding) + { + var response = context.HttpContext.Response; + response.ContentType = "application/xml"; + response.Headers["Content-Type"] = "application/xml; charset=" + selectedEncoding.WebName; + + using var memoryStream = new MemoryStream(); + await using var writer = new StreamWriter(memoryStream, selectedEncoding); + + _serializer.Serialize(writer, context.Object); + await writer.FlushAsync(); + + memoryStream.Position = 0; + response.ContentLength = memoryStream.Length; // Définir la longueur du contenu + await memoryStream.CopyToAsync(response.Body); + } +} \ No newline at end of file diff --git a/LittleBigMouse.Server/Properties/launchSettings.json b/LittleBigMouse.Server/Properties/launchSettings.json new file mode 100644 index 00000000..6c289039 --- /dev/null +++ b/LittleBigMouse.Server/Properties/launchSettings.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "applicationUrl": "http://localhost:5021", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "applicationUrl": "https://localhost:7217;http://localhost:5021", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/LittleBigMouse.Server/WeatherForecast.cs b/LittleBigMouse.Server/WeatherForecast.cs new file mode 100644 index 00000000..058f10b3 --- /dev/null +++ b/LittleBigMouse.Server/WeatherForecast.cs @@ -0,0 +1,13 @@ +namespace LittleBigMouse.Server +{ + public class WeatherForecast + { + public DateOnly Date { get; set; } + + public int TemperatureC { get; set; } + + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); + + public string? Summary { get; set; } + } +} diff --git a/LittleBigMouse.Server/appsettings.Development.json b/LittleBigMouse.Server/appsettings.Development.json new file mode 100644 index 00000000..0c208ae9 --- /dev/null +++ b/LittleBigMouse.Server/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/LittleBigMouse.Server/appsettings.json b/LittleBigMouse.Server/appsettings.json new file mode 100644 index 00000000..10f68b8c --- /dev/null +++ b/LittleBigMouse.Server/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/LittleBigMouse.Ui/LittleBigMouse.Ui.Avalonia/LittleBigMouse.Ui.Avalonia.csproj b/LittleBigMouse.Ui/LittleBigMouse.Ui.Avalonia/LittleBigMouse.Ui.Avalonia.csproj index 53824ca7..d4157064 100644 --- a/LittleBigMouse.Ui/LittleBigMouse.Ui.Avalonia/LittleBigMouse.Ui.Avalonia.csproj +++ b/LittleBigMouse.Ui/LittleBigMouse.Ui.Avalonia/LittleBigMouse.Ui.Avalonia.csproj @@ -12,7 +12,7 @@ lbm.png README.md https://github.com/mgth/LittleBigMouse - 5.2.4.0 + 5.3.0.0 app.manifest LittleBigMouse.Ui.Avalonia.Program Little Big Mouse diff --git a/LittleBigMouse.Ui/LittleBigMouse.Ui.Core/LittleBigMouse.Ui.Core.csproj b/LittleBigMouse.Ui/LittleBigMouse.Ui.Core/LittleBigMouse.Ui.Core.csproj index 574f8238..e4c572c4 100644 --- a/LittleBigMouse.Ui/LittleBigMouse.Ui.Core/LittleBigMouse.Ui.Core.csproj +++ b/LittleBigMouse.Ui/LittleBigMouse.Ui.Core/LittleBigMouse.Ui.Core.csproj @@ -6,7 +6,7 @@ enable x64;x86;AnyCpu preview - 5.2.4.0 + 5.3.0.0 diff --git a/LittleBigMouse.sln b/LittleBigMouse.sln index 5854c2e4..93a1b205 100644 --- a/LittleBigMouse.sln +++ b/LittleBigMouse.sln @@ -121,6 +121,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HLab.Base.ReactiveUI", "HLa EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LittleBigMouse.Ui.Loader", "LittleBigMouse.Ui.Loader\LittleBigMouse.Ui.Loader.csproj", "{693446A7-8CCC-4C57-956C-3FB5613E72B7}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Server", "Server", "{122F5172-1BDA-4C7D-9CCB-41D70DBFB53D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LittleBigMouse.Server", "LittleBigMouse.Server\LittleBigMouse.Server.csproj", "{94719656-30B8-4C25-98D0-5DB42D968FAB}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -799,6 +803,24 @@ Global {693446A7-8CCC-4C57-956C-3FB5613E72B7}.Release|x64.Build.0 = Release|Any CPU {693446A7-8CCC-4C57-956C-3FB5613E72B7}.Release|x86.ActiveCfg = Release|Any CPU {693446A7-8CCC-4C57-956C-3FB5613E72B7}.Release|x86.Build.0 = Release|Any CPU + {94719656-30B8-4C25-98D0-5DB42D968FAB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {94719656-30B8-4C25-98D0-5DB42D968FAB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {94719656-30B8-4C25-98D0-5DB42D968FAB}.Debug|x64.ActiveCfg = Debug|Any CPU + {94719656-30B8-4C25-98D0-5DB42D968FAB}.Debug|x64.Build.0 = Debug|Any CPU + {94719656-30B8-4C25-98D0-5DB42D968FAB}.Debug|x86.ActiveCfg = Debug|Any CPU + {94719656-30B8-4C25-98D0-5DB42D968FAB}.Debug|x86.Build.0 = Debug|Any CPU + {94719656-30B8-4C25-98D0-5DB42D968FAB}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU + {94719656-30B8-4C25-98D0-5DB42D968FAB}.DebugRelease|Any CPU.Build.0 = Release|Any CPU + {94719656-30B8-4C25-98D0-5DB42D968FAB}.DebugRelease|x64.ActiveCfg = Release|Any CPU + {94719656-30B8-4C25-98D0-5DB42D968FAB}.DebugRelease|x64.Build.0 = Release|Any CPU + {94719656-30B8-4C25-98D0-5DB42D968FAB}.DebugRelease|x86.ActiveCfg = Release|Any CPU + {94719656-30B8-4C25-98D0-5DB42D968FAB}.DebugRelease|x86.Build.0 = Release|Any CPU + {94719656-30B8-4C25-98D0-5DB42D968FAB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {94719656-30B8-4C25-98D0-5DB42D968FAB}.Release|Any CPU.Build.0 = Release|Any CPU + {94719656-30B8-4C25-98D0-5DB42D968FAB}.Release|x64.ActiveCfg = Release|Any CPU + {94719656-30B8-4C25-98D0-5DB42D968FAB}.Release|x64.Build.0 = Release|Any CPU + {94719656-30B8-4C25-98D0-5DB42D968FAB}.Release|x86.ActiveCfg = Release|Any CPU + {94719656-30B8-4C25-98D0-5DB42D968FAB}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -853,6 +875,8 @@ Global {967B2151-69DE-4BF5-A8BA-878F4DB47855} = {F9285DF6-1EB8-4E3F-87AD-01F8AF60C2D9} {054D5606-83D2-430F-A910-A4D7079A881A} = {81C727CD-20AF-492A-BE56-50EB2F20D754} {693446A7-8CCC-4C57-956C-3FB5613E72B7} = {7CD990BD-9361-4C23-A1D3-9BBF612F488D} + {122F5172-1BDA-4C7D-9CCB-41D70DBFB53D} = {35F8E798-DD0B-4382-AE4E-860720712F58} + {94719656-30B8-4C25-98D0-5DB42D968FAB} = {122F5172-1BDA-4C7D-9CCB-41D70DBFB53D} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {2294431E-9ED9-4BB8-AEDA-305882A2919F} From 73254919f6f0391339b7f1538cb38fae086872c3 Mon Sep 17 00:00:00 2001 From: Mathieu GRENET Date: Wed, 26 Mar 2025 18:51:28 +0100 Subject: [PATCH 03/33] Avalonia 11.2.5 --- HLab.Avalonia | 2 +- HLab.Core | 2 +- .../HLab.Sys.Argyll/HLab.Sys.Argyll.csproj | 6 +++--- ...Lab.Sys.Windows.MonitorVcp.Avalonia.csproj | 4 ++-- .../HLab.Sys.Windows.MonitorVcp.csproj | 2 +- .../HLab.Sys.Windows.Monitors.csproj | 6 +++--- .../LittleBigMouse.DisplayLayout.csproj | 12 +++++------ .../LittleBigMouse.Zoning.csproj | 6 +++--- .../Daemon/LittleBigMouseDaemon.cpp | 18 ++++++++--------- .../Daemon/LittleBigMouseDaemon.h | 2 +- .../Engine/HookMouseEventArg.h | 4 ++-- LittleBigMouse.Hook/Engine/MouseEngine.cpp | 2 +- LittleBigMouse.Hook/Engine/MouseEngine.h | 8 ++++---- LittleBigMouse.Hook/Engine/MouseHelper.h | 6 +++--- LittleBigMouse.Hook/Engine/Zone.cpp | 2 +- LittleBigMouse.Hook/Engine/Zone.h | 8 ++++---- LittleBigMouse.Hook/Engine/ZoneLink.h | 2 +- LittleBigMouse.Hook/Engine/ZonesLayout.cpp | 2 +- LittleBigMouse.Hook/Engine/ZonesLayout.h | 6 +++--- LittleBigMouse.Hook/Geometry/Line.h | 2 +- LittleBigMouse.Hook/Geometry/Point.h | 2 +- LittleBigMouse.Hook/Geometry/Segment.h | 2 +- LittleBigMouse.Hook/Hook/Hooker.cpp | 4 ++-- LittleBigMouse.Hook/Hook/Hooker.h | 8 ++++---- .../Hook/HookerDisplayChanged.cpp | 2 +- LittleBigMouse.Hook/Hook/HookerMouse.cpp | 2 +- LittleBigMouse.Hook/Hook/HookerWinEvents.cpp | 2 +- .../LittleBigMouse.Hook.vcxproj | 2 +- LittleBigMouse.Hook/Logger/Logger.h | 2 +- LittleBigMouse.Hook/Remote/ClientMessage.h | 2 +- LittleBigMouse.Hook/Remote/RemoteClient.cpp | 2 +- LittleBigMouse.Hook/Remote/RemoteClient.h | 4 ++-- LittleBigMouse.Hook/Remote/RemoteServer.h | 6 +++--- .../Remote/RemoteServerPipe.cpp | 2 +- LittleBigMouse.Hook/Remote/RemoteServerPipe.h | 4 ++-- .../Remote/RemoteServerSocket.h | 2 +- LittleBigMouse.Hook/Thread/ThreadHost.cpp | 2 +- LittleBigMouse.Hook/Thread/ThreadHost.h | 2 +- LittleBigMouse.Hook/Xml/XmlHelper.h | 6 +++--- ...ttleBigMouse.Plugin.Layout.Avalonia.csproj | 8 ++++---- .../LittleBigMouse.Plugin.Vcp.Avalonia.csproj | 8 ++++---- .../LittleBigMouse.Plugins.Avalonia.csproj | 6 +++--- .../LittleBigMouse.Plugins.csproj | 4 ++-- .../LittleBigMouse.Server.csproj | 4 +++- .../LittleBigMouse.Ui.Loader.csproj | 1 + .../LittleBigMouse.Ui.Avalonia.csproj | 20 +++++++++---------- .../LittleBigMouse.Ui.Core.csproj | 4 ++-- LittleBigMouse.sln | 16 +++++++-------- 48 files changed, 117 insertions(+), 114 deletions(-) diff --git a/HLab.Avalonia b/HLab.Avalonia index cc49b761..290daa16 160000 --- a/HLab.Avalonia +++ b/HLab.Avalonia @@ -1 +1 @@ -Subproject commit cc49b761c4a86b39b428ea5fd0f1c9a803182502 +Subproject commit 290daa16ae93bdb3adccd0da059eaed492eda1b3 diff --git a/HLab.Core b/HLab.Core index a76029e0..b1b73572 160000 --- a/HLab.Core +++ b/HLab.Core @@ -1 +1 @@ -Subproject commit a76029e08c0182544a822f74e4c313f2a81518a6 +Subproject commit b1b73572689087e2bcfef6d0080ca0e3b2914fa7 diff --git a/HLab.Sys/HLab.Sys.Argyll/HLab.Sys.Argyll.csproj b/HLab.Sys/HLab.Sys.Argyll/HLab.Sys.Argyll.csproj index 209e50fa..52a8a454 100644 --- a/HLab.Sys/HLab.Sys.Argyll/HLab.Sys.Argyll.csproj +++ b/HLab.Sys/HLab.Sys.Argyll/HLab.Sys.Argyll.csproj @@ -4,12 +4,12 @@ net8.0 AnyCPU;x64;x86 Debug;Release;ReleaseDebug - 2.4.0.0 + 2.5.0.0 - - + + diff --git a/HLab.Sys/HLab.Sys.Windows.MonitorVcp.Avalonia/HLab.Sys.Windows.MonitorVcp.Avalonia.csproj b/HLab.Sys/HLab.Sys.Windows.MonitorVcp.Avalonia/HLab.Sys.Windows.MonitorVcp.Avalonia.csproj index 26ada263..931e8e73 100644 --- a/HLab.Sys/HLab.Sys.Windows.MonitorVcp.Avalonia/HLab.Sys.Windows.MonitorVcp.Avalonia.csproj +++ b/HLab.Sys/HLab.Sys.Windows.MonitorVcp.Avalonia/HLab.Sys.Windows.MonitorVcp.Avalonia.csproj @@ -5,11 +5,11 @@ enable enable AnyCPU;x64;x86 - 2.4.0.0 + 2.5.0.0 - + diff --git a/HLab.Sys/HLab.Sys.Windows.MonitorVcp/HLab.Sys.Windows.MonitorVcp.csproj b/HLab.Sys/HLab.Sys.Windows.MonitorVcp/HLab.Sys.Windows.MonitorVcp.csproj index bf9f8a16..b5bcfcea 100644 --- a/HLab.Sys/HLab.Sys.Windows.MonitorVcp/HLab.Sys.Windows.MonitorVcp.csproj +++ b/HLab.Sys/HLab.Sys.Windows.MonitorVcp/HLab.Sys.Windows.MonitorVcp.csproj @@ -4,7 +4,7 @@ net8.0 x64;x86;AnyCpu Debug;Release - 2.4.0.0 + 2.5.0.0 diff --git a/HLab.Sys/HLab.Sys.Windows.Monitors/HLab.Sys.Windows.Monitors.csproj b/HLab.Sys/HLab.Sys.Windows.Monitors/HLab.Sys.Windows.Monitors.csproj index f475baed..b32cc298 100644 --- a/HLab.Sys/HLab.Sys.Windows.Monitors/HLab.Sys.Windows.Monitors.csproj +++ b/HLab.Sys/HLab.Sys.Windows.Monitors/HLab.Sys.Windows.Monitors.csproj @@ -8,12 +8,12 @@ Debug;Release true 12 - 2.4.0.0 + 2.5.0.0 - - + + diff --git a/LittleBigMouse.Core/LittleBigMouse.DisplayLayout/LittleBigMouse.DisplayLayout.csproj b/LittleBigMouse.Core/LittleBigMouse.DisplayLayout/LittleBigMouse.DisplayLayout.csproj index 798bf99d..13424f4a 100644 --- a/LittleBigMouse.Core/LittleBigMouse.DisplayLayout/LittleBigMouse.DisplayLayout.csproj +++ b/LittleBigMouse.Core/LittleBigMouse.DisplayLayout/LittleBigMouse.DisplayLayout.csproj @@ -1,8 +1,8 @@  - net8.0 - x64;x86;AnyCpu + net9.0 + x64 Library Debug;Release;ReleaseDebug 5.3.0.0 @@ -10,10 +10,10 @@ - - - - + + + + diff --git a/LittleBigMouse.Core/LittleBigMouse.Zones/LittleBigMouse.Zoning.csproj b/LittleBigMouse.Core/LittleBigMouse.Zones/LittleBigMouse.Zoning.csproj index cd876b34..d755929f 100644 --- a/LittleBigMouse.Core/LittleBigMouse.Zones/LittleBigMouse.Zoning.csproj +++ b/LittleBigMouse.Core/LittleBigMouse.Zones/LittleBigMouse.Zoning.csproj @@ -1,15 +1,15 @@  - net8.0 + net9.0 enable enable - AnyCPU;x64;x86 + x64 5.3.0.0 - + diff --git a/LittleBigMouse.Hook/Daemon/LittleBigMouseDaemon.cpp b/LittleBigMouse.Hook/Daemon/LittleBigMouseDaemon.cpp index 19759e5b..eff732f1 100644 --- a/LittleBigMouse.Hook/Daemon/LittleBigMouseDaemon.cpp +++ b/LittleBigMouse.Hook/Daemon/LittleBigMouseDaemon.cpp @@ -5,15 +5,15 @@ #include #pragma comment(lib,"shlwapi.lib") -#include "SignalSlot.h" - -#include "Engine/MouseEngine.h" -#include "Hook/Hooker.h" -#include "Remote/RemoteServer.h" -#include "Remote/RemoteClient.h" -#include "Xml/tinyxml2.h" -#include "Xml/XmlHelper.h" -#include "Strings/str.h" +#include "../SignalSlot.h" + +#include "../Engine/MouseEngine.h" +#include "../Hook/Hooker.h" +#include "../Remote/RemoteServer.h" +#include "../Remote/RemoteClient.h" +#include "../Xml/tinyxml2.h" +#include "../Xml/XmlHelper.h" +#include "../Strings/str.h" void LittleBigMouseDaemon::Unhooked() const { diff --git a/LittleBigMouse.Hook/Daemon/LittleBigMouseDaemon.h b/LittleBigMouse.Hook/Daemon/LittleBigMouseDaemon.h index 6bf3c4df..84213348 100644 --- a/LittleBigMouse.Hook/Daemon/LittleBigMouseDaemon.h +++ b/LittleBigMouse.Hook/Daemon/LittleBigMouseDaemon.h @@ -1,5 +1,5 @@ #pragma once -#include "Framework.h" +#include "../Framework.h" #include #include diff --git a/LittleBigMouse.Hook/Engine/HookMouseEventArg.h b/LittleBigMouse.Hook/Engine/HookMouseEventArg.h index 2780245a..ab132f6a 100644 --- a/LittleBigMouse.Hook/Engine/HookMouseEventArg.h +++ b/LittleBigMouse.Hook/Engine/HookMouseEventArg.h @@ -1,8 +1,8 @@ #pragma once -#include "Framework.h" +#include "../Framework.h" #include -#include "Geometry/Point.h" +#include "../Geometry/Point.h" class MouseEventArg { diff --git a/LittleBigMouse.Hook/Engine/MouseEngine.cpp b/LittleBigMouse.Hook/Engine/MouseEngine.cpp index 345d54c7..c48f4e9c 100644 --- a/LittleBigMouse.Hook/Engine/MouseEngine.cpp +++ b/LittleBigMouse.Hook/Engine/MouseEngine.cpp @@ -1,6 +1,6 @@ #include "MouseEngine.h" -#include "Geometry/Geometry.h" +#include "../Geometry/Geometry.h" #include "MouseHelper.h" #include "ZoneLink.h" diff --git a/LittleBigMouse.Hook/Engine/MouseEngine.h b/LittleBigMouse.Hook/Engine/MouseEngine.h index ea4cca65..d5cc67ae 100644 --- a/LittleBigMouse.Hook/Engine/MouseEngine.h +++ b/LittleBigMouse.Hook/Engine/MouseEngine.h @@ -1,13 +1,13 @@ #pragma once -#include "Framework.h" +#include "../Framework.h" #include -#include "SignalSlot.h" +#include "../SignalSlot.h" #include "HookMouseEventArg.h" #include "ZonesLayout.h" -#include "Geometry/Rect.h" -#include "Geometry/Segment.h" +#include "../Geometry/Rect.h" +#include "../Geometry/Segment.h" class ZoneLink; diff --git a/LittleBigMouse.Hook/Engine/MouseHelper.h b/LittleBigMouse.Hook/Engine/MouseHelper.h index 4fe6ecf9..c163ff52 100644 --- a/LittleBigMouse.Hook/Engine/MouseHelper.h +++ b/LittleBigMouse.Hook/Engine/MouseHelper.h @@ -1,8 +1,8 @@ #pragma once -#include "Framework.h" +#include "../Framework.h" -#include "Geometry/Point.h" -#include "Geometry/Rect.h" +#include "../Geometry/Point.h" +#include "../Geometry/Rect.h" void SetMouseLocation(const geo::Point& location); geo::Point GetMouseLocation(); diff --git a/LittleBigMouse.Hook/Engine/Zone.cpp b/LittleBigMouse.Hook/Engine/Zone.cpp index 3efdb30c..2e6462b4 100644 --- a/LittleBigMouse.Hook/Engine/Zone.cpp +++ b/LittleBigMouse.Hook/Engine/Zone.cpp @@ -3,7 +3,7 @@ #include #include -#include "Xml/tinyxml2.h" +#include "../Xml/tinyxml2.h" #include "ZoneLink.h" #include "ZonesLayout.h" diff --git a/LittleBigMouse.Hook/Engine/Zone.h b/LittleBigMouse.Hook/Engine/Zone.h index 0d36c0a9..58fa79ca 100644 --- a/LittleBigMouse.Hook/Engine/Zone.h +++ b/LittleBigMouse.Hook/Engine/Zone.h @@ -1,13 +1,13 @@ #pragma once -#include "Framework.h" +#include "../Framework.h" #include #include -#include "Xml/tinyxml2.h" +#include "../Xml/tinyxml2.h" -#include "Geometry/Point.h" -#include "Geometry/Rect.h" +#include "../Geometry/Point.h" +#include "../Geometry/Rect.h" class ZoneLink; class ZonesLayout; diff --git a/LittleBigMouse.Hook/Engine/ZoneLink.h b/LittleBigMouse.Hook/Engine/ZoneLink.h index 6bc12429..7735d8d0 100644 --- a/LittleBigMouse.Hook/Engine/ZoneLink.h +++ b/LittleBigMouse.Hook/Engine/ZoneLink.h @@ -1,5 +1,5 @@ #pragma once -#include "Framework.h" +#include "../Framework.h" class Zone; diff --git a/LittleBigMouse.Hook/Engine/ZonesLayout.cpp b/LittleBigMouse.Hook/Engine/ZonesLayout.cpp index 816b9099..2e48470c 100644 --- a/LittleBigMouse.Hook/Engine/ZonesLayout.cpp +++ b/LittleBigMouse.Hook/Engine/ZonesLayout.cpp @@ -1,6 +1,6 @@ #include "ZonesLayout.h" -#include "Xml/XmlHelper.h" +#include "../Xml/XmlHelper.h" #include "ZoneLink.h" #include "Zone.h" diff --git a/LittleBigMouse.Hook/Engine/ZonesLayout.h b/LittleBigMouse.Hook/Engine/ZonesLayout.h index 4c4bfb9d..7aed0e88 100644 --- a/LittleBigMouse.Hook/Engine/ZonesLayout.h +++ b/LittleBigMouse.Hook/Engine/ZonesLayout.h @@ -1,10 +1,10 @@ #pragma once -#include "Framework.h" +#include "../Framework.h" #include -#include "Geometry/Point.h" -#include "Xml/tinyxml2.h" +#include "../Geometry/Point.h" +#include "../Xml/tinyxml2.h" #include "Priority.h" class Zone; diff --git a/LittleBigMouse.Hook/Geometry/Line.h b/LittleBigMouse.Hook/Geometry/Line.h index 8272b2a3..20e412bf 100644 --- a/LittleBigMouse.Hook/Geometry/Line.h +++ b/LittleBigMouse.Hook/Geometry/Line.h @@ -1,5 +1,5 @@ #pragma once -#include "Framework.h" +#include "../Framework.h" #include "Point.h" diff --git a/LittleBigMouse.Hook/Geometry/Point.h b/LittleBigMouse.Hook/Geometry/Point.h index 8f01a580..2c8ea940 100644 --- a/LittleBigMouse.Hook/Geometry/Point.h +++ b/LittleBigMouse.Hook/Geometry/Point.h @@ -1,5 +1,5 @@ #pragma once -#include "Framework.h" +#include "../Framework.h" #include #include diff --git a/LittleBigMouse.Hook/Geometry/Segment.h b/LittleBigMouse.Hook/Geometry/Segment.h index fa07e00d..2da1f4cd 100644 --- a/LittleBigMouse.Hook/Geometry/Segment.h +++ b/LittleBigMouse.Hook/Geometry/Segment.h @@ -1,5 +1,5 @@ #pragma once -#include "Framework.h" +#include "../Framework.h" #include diff --git a/LittleBigMouse.Hook/Hook/Hooker.cpp b/LittleBigMouse.Hook/Hook/Hooker.cpp index 46345ec2..fc13ba20 100644 --- a/LittleBigMouse.Hook/Hook/Hooker.cpp +++ b/LittleBigMouse.Hook/Hook/Hooker.cpp @@ -1,7 +1,7 @@ #include "Hooker.h" -#include "Logger/Logger.h" -#include "Remote/RemoteServer.h" +#include "../Logger/Logger.h" +#include "../Remote/RemoteServer.h" std::atomic Hooker::_instance = nullptr; diff --git a/LittleBigMouse.Hook/Hook/Hooker.h b/LittleBigMouse.Hook/Hook/Hooker.h index 90aab337..4461648b 100644 --- a/LittleBigMouse.Hook/Hook/Hooker.h +++ b/LittleBigMouse.Hook/Hook/Hooker.h @@ -1,10 +1,10 @@ #pragma once -#include "framework.h" +#include "../framework.h" #include -#include "SignalSlot.h" -#include "Engine/Priority.h" -#include "Thread/ThreadHost.h" +#include "../SignalSlot.h" +#include "../Engine/Priority.h" +#include "../Thread/ThreadHost.h" class MouseEventArg; class MouseEngine; diff --git a/LittleBigMouse.Hook/Hook/HookerDisplayChanged.cpp b/LittleBigMouse.Hook/Hook/HookerDisplayChanged.cpp index c9e1aa5b..a92eb29a 100644 --- a/LittleBigMouse.Hook/Hook/HookerDisplayChanged.cpp +++ b/LittleBigMouse.Hook/Hook/HookerDisplayChanged.cpp @@ -1,5 +1,5 @@ #include "Hooker.h" -#include "Strings/str.h" +#include "../Strings/str.h" #define MAX_LOADSTRING 100 diff --git a/LittleBigMouse.Hook/Hook/HookerMouse.cpp b/LittleBigMouse.Hook/Hook/HookerMouse.cpp index a6be0bfc..fa17ef6f 100644 --- a/LittleBigMouse.Hook/Hook/HookerMouse.cpp +++ b/LittleBigMouse.Hook/Hook/HookerMouse.cpp @@ -1,6 +1,6 @@ #include "Hooker.h" -#include "Engine/MouseEngine.h" +#include "../Engine/MouseEngine.h" void Hooker::HookMouse() { diff --git a/LittleBigMouse.Hook/Hook/HookerWinEvents.cpp b/LittleBigMouse.Hook/Hook/HookerWinEvents.cpp index 50d8538d..e4ba845d 100644 --- a/LittleBigMouse.Hook/Hook/HookerWinEvents.cpp +++ b/LittleBigMouse.Hook/Hook/HookerWinEvents.cpp @@ -1,6 +1,6 @@ #include "Hooker.h" -#include "Strings/str.h" +#include "../Strings/str.h" DWORD GetProcessIdFromWindow(HWND hWnd) { DWORD processId; diff --git a/LittleBigMouse.Hook/LittleBigMouse.Hook.vcxproj b/LittleBigMouse.Hook/LittleBigMouse.Hook.vcxproj index 7ff9f5b8..b17e7183 100644 --- a/LittleBigMouse.Hook/LittleBigMouse.Hook.vcxproj +++ b/LittleBigMouse.Hook/LittleBigMouse.Hook.vcxproj @@ -193,7 +193,7 @@ _DEBUG_;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true true - $(ProjectDir);C:\boost_1_87_0 + $(ProjectDir) stdcpp20 stdc17 diff --git a/LittleBigMouse.Hook/Logger/Logger.h b/LittleBigMouse.Hook/Logger/Logger.h index 7f6f8081..29aa3c0a 100644 --- a/LittleBigMouse.Hook/Logger/Logger.h +++ b/LittleBigMouse.Hook/Logger/Logger.h @@ -1,5 +1,5 @@ #pragma once -#include "Config.h" +#include "../Config.h" #if _DEBUG && DEBUG_LOG diff --git a/LittleBigMouse.Hook/Remote/ClientMessage.h b/LittleBigMouse.Hook/Remote/ClientMessage.h index f196ea9d..dd99e2c5 100644 --- a/LittleBigMouse.Hook/Remote/ClientMessage.h +++ b/LittleBigMouse.Hook/Remote/ClientMessage.h @@ -1,5 +1,5 @@ #pragma once -#include "Framework.h" +#include "../Framework.h" #include class RemoteClient; diff --git a/LittleBigMouse.Hook/Remote/RemoteClient.cpp b/LittleBigMouse.Hook/Remote/RemoteClient.cpp index 458cf71b..629202f7 100644 --- a/LittleBigMouse.Hook/Remote/RemoteClient.cpp +++ b/LittleBigMouse.Hook/Remote/RemoteClient.cpp @@ -1,4 +1,4 @@ -#include "Framework.h" +#include "../Framework.h" #include "RemoteClient.h" #include "RemoteServerSocket.h" diff --git a/LittleBigMouse.Hook/Remote/RemoteClient.h b/LittleBigMouse.Hook/Remote/RemoteClient.h index 34dc9cdd..689c3da5 100644 --- a/LittleBigMouse.Hook/Remote/RemoteClient.h +++ b/LittleBigMouse.Hook/Remote/RemoteClient.h @@ -1,9 +1,9 @@ #pragma once -#include "Framework.h" +#include "../Framework.h" #include -#include "Thread/ThreadHost.h" +#include "../Thread/ThreadHost.h" class RemoteServerSocket; diff --git a/LittleBigMouse.Hook/Remote/RemoteServer.h b/LittleBigMouse.Hook/Remote/RemoteServer.h index b533e260..9df9d0ef 100644 --- a/LittleBigMouse.Hook/Remote/RemoteServer.h +++ b/LittleBigMouse.Hook/Remote/RemoteServer.h @@ -1,12 +1,12 @@ #pragma once -#include "framework.h" +#include "../framework.h" #include #include -#include "SignalSlot.h" +#include "../SignalSlot.h" #include "RemoteClient.h" -#include "Thread/ThreadHost.h" +#include "../Thread/ThreadHost.h" class RemoteClient; class ClientMessage; diff --git a/LittleBigMouse.Hook/Remote/RemoteServerPipe.cpp b/LittleBigMouse.Hook/Remote/RemoteServerPipe.cpp index 34a1273c..2c5bc0e3 100644 --- a/LittleBigMouse.Hook/Remote/RemoteServerPipe.cpp +++ b/LittleBigMouse.Hook/Remote/RemoteServerPipe.cpp @@ -2,7 +2,7 @@ #include "RemoteServer.h" -#include "Strings/str.h" +#include "../Strings/str.h" bool RemoteServerPipe::StartListener() { diff --git a/LittleBigMouse.Hook/Remote/RemoteServerPipe.h b/LittleBigMouse.Hook/Remote/RemoteServerPipe.h index 3e1afedc..4b2c6da2 100644 --- a/LittleBigMouse.Hook/Remote/RemoteServerPipe.h +++ b/LittleBigMouse.Hook/Remote/RemoteServerPipe.h @@ -1,9 +1,9 @@ #pragma once -#include "Framework.h" +#include "../Framework.h" #include -#include "Engine/HookMouseEventArg.h" +#include "../Engine/HookMouseEventArg.h" #include "RemoteServer.h" constexpr int BUFFERSIZE = 1024*16; diff --git a/LittleBigMouse.Hook/Remote/RemoteServerSocket.h b/LittleBigMouse.Hook/Remote/RemoteServerSocket.h index a3dc8e61..aa7430de 100644 --- a/LittleBigMouse.Hook/Remote/RemoteServerSocket.h +++ b/LittleBigMouse.Hook/Remote/RemoteServerSocket.h @@ -1,5 +1,5 @@ #pragma once -#include "Framework.h" +#include "../Framework.h" #include #include diff --git a/LittleBigMouse.Hook/Thread/ThreadHost.cpp b/LittleBigMouse.Hook/Thread/ThreadHost.cpp index 9820b4ea..c369e3ea 100644 --- a/LittleBigMouse.Hook/Thread/ThreadHost.cpp +++ b/LittleBigMouse.Hook/Thread/ThreadHost.cpp @@ -1,6 +1,6 @@ #include "ThreadHost.h" -#include "Daemon/LittleBigMouseDaemon.h" +#include "../Daemon/LittleBigMouseDaemon.h" ThreadHost::~ThreadHost() { diff --git a/LittleBigMouse.Hook/Thread/ThreadHost.h b/LittleBigMouse.Hook/Thread/ThreadHost.h index 07921538..4d6219bc 100644 --- a/LittleBigMouse.Hook/Thread/ThreadHost.h +++ b/LittleBigMouse.Hook/Thread/ThreadHost.h @@ -1,5 +1,5 @@ #pragma once -#include "Framework.h" +#include "../Framework.h" #include #include diff --git a/LittleBigMouse.Hook/Xml/XmlHelper.h b/LittleBigMouse.Hook/Xml/XmlHelper.h index acc88a4c..e26e591e 100644 --- a/LittleBigMouse.Hook/Xml/XmlHelper.h +++ b/LittleBigMouse.Hook/Xml/XmlHelper.h @@ -1,10 +1,10 @@ #pragma once -#include "Framework.h" +#include "../Framework.h" #include -#include "Geometry/Rect.h" -#include "Xml/tinyxml2.h" +#include "../Geometry/Rect.h" +#include "../Xml/tinyxml2.h" class XmlHelper { diff --git a/LittleBigMouse.Plugins/LittleBigMouse.Plugin.Layout.Avalonia/LittleBigMouse.Plugin.Layout.Avalonia.csproj b/LittleBigMouse.Plugins/LittleBigMouse.Plugin.Layout.Avalonia/LittleBigMouse.Plugin.Layout.Avalonia.csproj index b657b8de..83ac1b2b 100644 --- a/LittleBigMouse.Plugins/LittleBigMouse.Plugin.Layout.Avalonia/LittleBigMouse.Plugin.Layout.Avalonia.csproj +++ b/LittleBigMouse.Plugins/LittleBigMouse.Plugin.Layout.Avalonia/LittleBigMouse.Plugin.Layout.Avalonia.csproj @@ -1,10 +1,10 @@  - net8.0 + net9.0 enable enable - x64;x86;AnyCpu + x64 true preview 5.3.0.0 @@ -21,8 +21,8 @@ - - + + diff --git a/LittleBigMouse.Plugins/LittleBigMouse.Plugin.Vcp.Avalonia/LittleBigMouse.Plugin.Vcp.Avalonia.csproj b/LittleBigMouse.Plugins/LittleBigMouse.Plugin.Vcp.Avalonia/LittleBigMouse.Plugin.Vcp.Avalonia.csproj index a2805117..cf20d148 100644 --- a/LittleBigMouse.Plugins/LittleBigMouse.Plugin.Vcp.Avalonia/LittleBigMouse.Plugin.Vcp.Avalonia.csproj +++ b/LittleBigMouse.Plugins/LittleBigMouse.Plugin.Vcp.Avalonia/LittleBigMouse.Plugin.Vcp.Avalonia.csproj @@ -1,10 +1,10 @@  - net8.0 + net9.0 enable enable - AnyCPU;x64;x86 + x64 preview true 5.3.0.0 @@ -21,8 +21,8 @@ - - + + diff --git a/LittleBigMouse.Plugins/LittleBigMouse.Plugins.Avalonia/LittleBigMouse.Plugins.Avalonia.csproj b/LittleBigMouse.Plugins/LittleBigMouse.Plugins.Avalonia/LittleBigMouse.Plugins.Avalonia.csproj index 1729f1a3..c6696f7c 100644 --- a/LittleBigMouse.Plugins/LittleBigMouse.Plugins.Avalonia/LittleBigMouse.Plugins.Avalonia.csproj +++ b/LittleBigMouse.Plugins/LittleBigMouse.Plugins.Avalonia/LittleBigMouse.Plugins.Avalonia.csproj @@ -1,15 +1,15 @@  - net8.0 + net9.0 enable - x64;x86;AnyCpu + x64 5.3.0.0 true - + diff --git a/LittleBigMouse.Plugins/LittleBigMouse.Plugins.Core/LittleBigMouse.Plugins.csproj b/LittleBigMouse.Plugins/LittleBigMouse.Plugins.Core/LittleBigMouse.Plugins.csproj index aff96032..c5d59142 100644 --- a/LittleBigMouse.Plugins/LittleBigMouse.Plugins.Core/LittleBigMouse.Plugins.csproj +++ b/LittleBigMouse.Plugins/LittleBigMouse.Plugins.Core/LittleBigMouse.Plugins.csproj @@ -1,10 +1,10 @@ - net8.0 + net9.0 enable enable - x64;x86;AnyCpu + x64 5.3.0.0 diff --git a/LittleBigMouse.Server/LittleBigMouse.Server.csproj b/LittleBigMouse.Server/LittleBigMouse.Server.csproj index 1cd5c7c0..83205f6c 100644 --- a/LittleBigMouse.Server/LittleBigMouse.Server.csproj +++ b/LittleBigMouse.Server/LittleBigMouse.Server.csproj @@ -4,11 +4,13 @@ net9.0 enable enable + AnyCPU;x64 - + + diff --git a/LittleBigMouse.Ui.Loader/LittleBigMouse.Ui.Loader.csproj b/LittleBigMouse.Ui.Loader/LittleBigMouse.Ui.Loader.csproj index 2150e379..d8675cd9 100644 --- a/LittleBigMouse.Ui.Loader/LittleBigMouse.Ui.Loader.csproj +++ b/LittleBigMouse.Ui.Loader/LittleBigMouse.Ui.Loader.csproj @@ -5,6 +5,7 @@ net8.0 enable enable + AnyCPU;x64 diff --git a/LittleBigMouse.Ui/LittleBigMouse.Ui.Avalonia/LittleBigMouse.Ui.Avalonia.csproj b/LittleBigMouse.Ui/LittleBigMouse.Ui.Avalonia/LittleBigMouse.Ui.Avalonia.csproj index d4157064..605ff463 100644 --- a/LittleBigMouse.Ui/LittleBigMouse.Ui.Avalonia/LittleBigMouse.Ui.Avalonia.csproj +++ b/LittleBigMouse.Ui/LittleBigMouse.Ui.Avalonia/LittleBigMouse.Ui.Avalonia.csproj @@ -1,8 +1,8 @@  - net8.0 + net9.0 enable - x64;x86;AnyCPU + x64 WinExe Assets\lbm-logo.ico preview @@ -50,18 +50,18 @@ - - - - - - + + + + + + - - + + diff --git a/LittleBigMouse.Ui/LittleBigMouse.Ui.Core/LittleBigMouse.Ui.Core.csproj b/LittleBigMouse.Ui/LittleBigMouse.Ui.Core/LittleBigMouse.Ui.Core.csproj index e4c572c4..f72c29bb 100644 --- a/LittleBigMouse.Ui/LittleBigMouse.Ui.Core/LittleBigMouse.Ui.Core.csproj +++ b/LittleBigMouse.Ui/LittleBigMouse.Ui.Core/LittleBigMouse.Ui.Core.csproj @@ -1,10 +1,10 @@ - net8.0 + net9.0 enable enable - x64;x86;AnyCpu + x64 preview 5.3.0.0 diff --git a/LittleBigMouse.sln b/LittleBigMouse.sln index 93a1b205..7d391115 100644 --- a/LittleBigMouse.sln +++ b/LittleBigMouse.sln @@ -751,8 +751,8 @@ Global {9BAC842F-54A9-4104-859F-43C8AE7CC8F4}.Release|x86.Build.0 = Release|x86 {6CA136B2-9239-4A02-9007-B67D9940674D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6CA136B2-9239-4A02-9007-B67D9940674D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6CA136B2-9239-4A02-9007-B67D9940674D}.Debug|x64.ActiveCfg = Debug|Any CPU - {6CA136B2-9239-4A02-9007-B67D9940674D}.Debug|x64.Build.0 = Debug|Any CPU + {6CA136B2-9239-4A02-9007-B67D9940674D}.Debug|x64.ActiveCfg = Debug|x64 + {6CA136B2-9239-4A02-9007-B67D9940674D}.Debug|x64.Build.0 = Debug|x64 {6CA136B2-9239-4A02-9007-B67D9940674D}.Debug|x86.ActiveCfg = Debug|Any CPU {6CA136B2-9239-4A02-9007-B67D9940674D}.Debug|x86.Build.0 = Debug|Any CPU {6CA136B2-9239-4A02-9007-B67D9940674D}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU @@ -769,8 +769,8 @@ Global {6CA136B2-9239-4A02-9007-B67D9940674D}.Release|x86.Build.0 = Release|Any CPU {054D5606-83D2-430F-A910-A4D7079A881A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {054D5606-83D2-430F-A910-A4D7079A881A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {054D5606-83D2-430F-A910-A4D7079A881A}.Debug|x64.ActiveCfg = Debug|Any CPU - {054D5606-83D2-430F-A910-A4D7079A881A}.Debug|x64.Build.0 = Debug|Any CPU + {054D5606-83D2-430F-A910-A4D7079A881A}.Debug|x64.ActiveCfg = Debug|x64 + {054D5606-83D2-430F-A910-A4D7079A881A}.Debug|x64.Build.0 = Debug|x64 {054D5606-83D2-430F-A910-A4D7079A881A}.Debug|x86.ActiveCfg = Debug|Any CPU {054D5606-83D2-430F-A910-A4D7079A881A}.Debug|x86.Build.0 = Debug|Any CPU {054D5606-83D2-430F-A910-A4D7079A881A}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU @@ -787,8 +787,8 @@ Global {054D5606-83D2-430F-A910-A4D7079A881A}.Release|x86.Build.0 = Release|Any CPU {693446A7-8CCC-4C57-956C-3FB5613E72B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {693446A7-8CCC-4C57-956C-3FB5613E72B7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {693446A7-8CCC-4C57-956C-3FB5613E72B7}.Debug|x64.ActiveCfg = Debug|Any CPU - {693446A7-8CCC-4C57-956C-3FB5613E72B7}.Debug|x64.Build.0 = Debug|Any CPU + {693446A7-8CCC-4C57-956C-3FB5613E72B7}.Debug|x64.ActiveCfg = Debug|x64 + {693446A7-8CCC-4C57-956C-3FB5613E72B7}.Debug|x64.Build.0 = Debug|x64 {693446A7-8CCC-4C57-956C-3FB5613E72B7}.Debug|x86.ActiveCfg = Debug|Any CPU {693446A7-8CCC-4C57-956C-3FB5613E72B7}.Debug|x86.Build.0 = Debug|Any CPU {693446A7-8CCC-4C57-956C-3FB5613E72B7}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU @@ -805,8 +805,8 @@ Global {693446A7-8CCC-4C57-956C-3FB5613E72B7}.Release|x86.Build.0 = Release|Any CPU {94719656-30B8-4C25-98D0-5DB42D968FAB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {94719656-30B8-4C25-98D0-5DB42D968FAB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {94719656-30B8-4C25-98D0-5DB42D968FAB}.Debug|x64.ActiveCfg = Debug|Any CPU - {94719656-30B8-4C25-98D0-5DB42D968FAB}.Debug|x64.Build.0 = Debug|Any CPU + {94719656-30B8-4C25-98D0-5DB42D968FAB}.Debug|x64.ActiveCfg = Debug|x64 + {94719656-30B8-4C25-98D0-5DB42D968FAB}.Debug|x64.Build.0 = Debug|x64 {94719656-30B8-4C25-98D0-5DB42D968FAB}.Debug|x86.ActiveCfg = Debug|Any CPU {94719656-30B8-4C25-98D0-5DB42D968FAB}.Debug|x86.Build.0 = Debug|Any CPU {94719656-30B8-4C25-98D0-5DB42D968FAB}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU From f92bac2d00b818483331f29c5a6d9eebd0990ebf Mon Sep 17 00:00:00 2001 From: Mathieu GRENET Date: Thu, 27 Mar 2025 09:13:30 +0100 Subject: [PATCH 04/33] HLab updates --- .../DrawingContextExtention.cs | 8 +- .../Rulers/RulerViewTop.cs | 4 +- .../VcpSliderViewModel.cs | 2 +- .../Main/LayoutFactory.cs | 3 +- .../MonitorFrame/MonitorFrameViewModel.cs | 393 +++++++------ .../Remote/LittleBigMouseClientService.cs | 2 +- LittleBigMouse.sln | 555 +----------------- 7 files changed, 217 insertions(+), 750 deletions(-) diff --git a/HLab.Sys/HLab.Sys.Windows.MonitorVcp.Avalonia/DrawingContextExtention.cs b/HLab.Sys/HLab.Sys.Windows.MonitorVcp.Avalonia/DrawingContextExtention.cs index ded79c71..005785c0 100644 --- a/HLab.Sys/HLab.Sys.Windows.MonitorVcp.Avalonia/DrawingContextExtention.cs +++ b/HLab.Sys/HLab.Sys.Windows.MonitorVcp.Avalonia/DrawingContextExtention.cs @@ -100,9 +100,9 @@ double _g(double value, double gg) } var startColor = - new ColorRGB(1.0, _g(colorA.Red / 2.0, startGamma), _g(colorA.Green / 2.0, startGamma), _g(colorA.Blue / 2.0, startGamma)); + HLabColors.RGB(1.0, _g(colorA.Red / 2.0, startGamma), _g(colorA.Green / 2.0, startGamma), _g(colorA.Blue / 2.0, startGamma)); var endColor = - new ColorRGB(1.0, _g(colorA.Red/2.0, endGamma), _g(colorA.Green/2.0, endGamma), _g(colorA.Blue/2.0, endGamma)); + HLabColors.RGB(1.0, _g(colorA.Red/2.0, endGamma), _g(colorA.Green/2.0, endGamma), _g(colorA.Blue/2.0, endGamma)); // var startColor = Color.FromScRgb(f1.0, _g(colorA.ScG/2.0f, startGamma), _g(colorA.ScB/2.0f, startGamma)); // var endColor = Color.FromScRgb(1.0f, _g(colorA.ScR/2.0f, endGamma), _g(colorA.ScG/2.0f, endGamma), _g(colorA.ScB/2.0f, endGamma)); @@ -270,12 +270,12 @@ public GradientCalculator(IColor c1, IColor c2, double gamma) _db = (colorB.Blue - _ba); } - float g(double value) => (float)Math.Pow(value, _invgamma); + double g(double value) => Math.Pow(value, _invgamma); public ColorRGB Get(double p) { - return new ColorRGB( + return HLabColors.RGB( g(_aa + _da * p), g(_ra + _dr * p), g(_ga + _dg * p), diff --git a/LittleBigMouse.Plugins/LittleBigMouse.Plugin.Layout.Avalonia/Rulers/RulerViewTop.cs b/LittleBigMouse.Plugins/LittleBigMouse.Plugin.Layout.Avalonia/Rulers/RulerViewTop.cs index 04c9844a..f69e65dc 100644 --- a/LittleBigMouse.Plugins/LittleBigMouse.Plugin.Layout.Avalonia/Rulers/RulerViewTop.cs +++ b/LittleBigMouse.Plugins/LittleBigMouse.Plugin.Layout.Avalonia/Rulers/RulerViewTop.cs @@ -69,7 +69,7 @@ public Brush GetBackground(Color color) protected static Brush GetBrush(double x1, double y1, double x2, double y2, Color c0) { var c1 = c0.ToColor(); - var c2 = new ColorRGB(0, c1.Red / 3, c1.Green / 3, c1.Blue / 3).ToAvaloniaColor(); + var c2 = HLabColors.RGB(0, c1.Red / 3, c1.Green / 3, c1.Blue / 3).ToAvaloniaColor(); return new LinearGradientBrush { @@ -282,7 +282,7 @@ public bool Selected readonly Pen _penIn = new(Brushes.WhiteSmoke, 1); - readonly Pen _penOut = new(new SolidColorBrush(new ColorRGB(0.7, 0.7, 0.7, 0.7).ToAvaloniaColor()), 1); + readonly Pen _penOut = new(new SolidColorBrush(HLabColors.RGB(0.7, 0.7, 0.7, 0.7).ToAvaloniaColor()), 1); protected void Render() { diff --git a/LittleBigMouse.Plugins/LittleBigMouse.Plugin.Vcp.Avalonia/VcpSliderViewModel.cs b/LittleBigMouse.Plugins/LittleBigMouse.Plugin.Vcp.Avalonia/VcpSliderViewModel.cs index 73c6f368..6590c80f 100644 --- a/LittleBigMouse.Plugins/LittleBigMouse.Plugin.Vcp.Avalonia/VcpSliderViewModel.cs +++ b/LittleBigMouse.Plugins/LittleBigMouse.Plugin.Vcp.Avalonia/VcpSliderViewModel.cs @@ -86,6 +86,6 @@ static Brush GetBackground(Color c) => static Brush GetBorderBrush(Color c) => new SolidColorBrush( - new ColorRGB(c.A * 0.9, c.R * 0.5+0.5, c.G * 0.5 + 0.5, c.B * 0.5 + 0.5).ToAvaloniaColor() + HLabColors.RGB(c.A * 0.9, c.R * 0.5+0.5, c.G * 0.5 + 0.5, c.B * 0.5 + 0.5).ToAvaloniaColor() ); } \ No newline at end of file diff --git a/LittleBigMouse.Ui/LittleBigMouse.Ui.Avalonia/Main/LayoutFactory.cs b/LittleBigMouse.Ui/LittleBigMouse.Ui.Avalonia/Main/LayoutFactory.cs index 4db665f1..ce35acfb 100644 --- a/LittleBigMouse.Ui/LittleBigMouse.Ui.Avalonia/Main/LayoutFactory.cs +++ b/LittleBigMouse.Ui/LittleBigMouse.Ui.Avalonia/Main/LayoutFactory.cs @@ -172,7 +172,8 @@ public static PhysicalMonitorModel SetSizeFrom(this PhysicalMonitorModel @this, } else if (monitor.Edid != null) { - @this.PhysicalSize.Set(monitor.Edid.PhysicalSize); + @this.PhysicalSize.Width = monitor.Edid.PhysicalWidth; + @this.PhysicalSize.Height = monitor.Edid.PhysicalHeight; } @this.PhysicalSize.FixedAspectRatio = old; diff --git a/LittleBigMouse.Ui/LittleBigMouse.Ui.Avalonia/MonitorFrame/MonitorFrameViewModel.cs b/LittleBigMouse.Ui/LittleBigMouse.Ui.Avalonia/MonitorFrame/MonitorFrameViewModel.cs index 41a97416..135d81e8 100644 --- a/LittleBigMouse.Ui/LittleBigMouse.Ui.Avalonia/MonitorFrame/MonitorFrameViewModel.cs +++ b/LittleBigMouse.Ui/LittleBigMouse.Ui.Avalonia/MonitorFrame/MonitorFrameViewModel.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics; using System.Reactive.Linq; using System.Threading.Tasks; using Avalonia; @@ -16,213 +17,217 @@ namespace LittleBigMouse.Ui.Avalonia.MonitorFrame; public class MonitorFrameViewModel : ViewModel, IMvvmContextProvider, IMonitorFrameViewModel { - public MonitorFrameViewModel() - { - _rotated = this.WhenAnyValue( - e => e.MonitorsPresenter.VisualRatio, - e => e.Model.DepthProjection, - (ratio, mm) => mm.ScaleWithLocation(ratio) - ).Log(this, "_rotated").ToProperty(this, e => e.Rotated); - - _rotation = this.WhenAnyValue( - e => e.Model.ActiveSource.Source.Orientation, - e => e.Rotated.Height, - e => e.Rotated.Width, - (o, h, w) => - { - if (o == 0) return null; - - var t = new TransformGroup(); - t.Children.Add(new RotateTransform(90 * o)); - - //switch (o) - //{ - // case 1: - // t.Children.Add(new TranslateTransform(w, 0)); - // break; - // case 2: - // t.Children.Add(new TranslateTransform(w, h)); - // break; - // case 3: - // t.Children.Add(new TranslateTransform(0, h)); - // break; - //} - return t; - } - ).Log(this, "_rotation").ToProperty(this, e => e.Rotation); - - _logoPadding = this.WhenAnyValue( - e => e.MonitorsPresenter.VisualRatio.X, - e => e.MonitorsPresenter.VisualRatio.Y, - (x, y) => new Thickness(4 * x, 4 * y, 4 * x, 4 * y) - ).Log(this, "_logoPadding").ToProperty(this, e => e.LogoPadding); - - _left = this.WhenAnyValue( - e => e.MonitorsPresenter.VisualRatio.X, - e => e.Location.X, - e => e.MonitorsPresenter.Model.X0, - e => e.Model.DepthProjection.LeftBorder, - - (rx, x, x0, leftBorder) => rx * (x0 + x - leftBorder) - - ).Log(this, "_left").ToProperty(this, e => e.Left); - - _top = this.WhenAnyValue( - e => e.MonitorsPresenter.VisualRatio.Y, - e => e.Location.Y, - e => e.MonitorsPresenter.Model.Y0, - e => e.Model.DepthProjection.TopBorder, - - (ry, y, y0, topBorder) => ry * (y0 + y - topBorder) - - ).Log(this, "_top").ToProperty(this, e => e.Top); - - _margin = this.WhenAnyValue( - e => e.Left, - e => e.Top, (left, top) => new Thickness(Left, Top, 0, 0) - ).Log(this, "_margin").ToProperty(this, e => e.Margin); - - _unrotated = this.WhenAnyValue( - e => e.MonitorsPresenter.VisualRatio, - e => e.Model.DepthProjectionUnrotated, - e => e.Model.ActiveSource.Source.Orientation, - (ratio, mmu, o) => mmu.ScaleWithLocation(ratio) - ).Log(this, "_unrotated").ToProperty(this, e => e.Unrotated); - - var cmd = ReactiveCommand.CreateFromTask<(string, WallpaperStyle, Color)>(p => SetWallpaper(p.Item1, p.Item2, p.Item3)); - - this.WhenAnyValue( - e => e.Model.ActiveSource.Source.WallpaperPath, - e => e.Model.ActiveSource.Source.WallpaperStyle, - e => e.Model.ActiveSource.Source.BackgroundColor) - .InvokeCommand(cmd).DisposeWith(this); - - this - .WhenAnyValue(e => e.Model) - .Select(e => e) - .Do(e => Location = new FrameLocation(e)) - .Subscribe().DisposeWith(this); - - _selected = this.WhenAnyValue( - e => e.MonitorsPresenter.SelectedMonitor, - e => e.Model, - (selected, monitor) => selected == monitor - ) - .ToProperty(this, e => e.Selected); - - Disposer.OnDispose(() => - { - if (_wallpaper is IDisposable bmp) - { - bmp.Dispose(); - } - _wallpaper = null; - }); - } - - Rect GetBounds(int shrink) - { - var r = new Rect(); - foreach (var s in Model.Layout.PhysicalSources) - { - r = r.Union(s.Source.InPixel.Bounds); - } - - return new Rect(r.X/shrink,r.Y/shrink,r.Width/shrink,r.Height/shrink); - } - - async Task SetWallpaper(string path, WallpaperStyle style, Color color) - { - if(string.IsNullOrWhiteSpace(path)) - { - Wallpaper = null; - return; - } - - //All dimensions are divided by this value to reduce memory usage - const int shrink = 4; - - var r = Model.ActiveSource.Source.InPixel.Bounds; - - - if (r.Width < shrink || r.Height < shrink) - { - Wallpaper = null; - return; - } + public MonitorFrameViewModel() + { + _rotated = this.WhenAnyValue( + e => e.MonitorsPresenter.VisualRatio, + e => e.Model.DepthProjection, + (ratio, mm) => mm.ScaleWithLocation(ratio) + ).Log(this, "_rotated").ToProperty(this, e => e.Rotated); + + _rotation = this.WhenAnyValue( + e => e.Model.ActiveSource.Source.Orientation, + e => e.Rotated.Height, + e => e.Rotated.Width, + (o, h, w) => + { + if (o == 0) return null; + + var t = new TransformGroup(); + t.Children.Add(new RotateTransform(90 * o)); + + //switch (o) + //{ + // case 1: + // t.Children.Add(new TranslateTransform(w, 0)); + // break; + // case 2: + // t.Children.Add(new TranslateTransform(w, h)); + // break; + // case 3: + // t.Children.Add(new TranslateTransform(0, h)); + // break; + //} + return t; + } + ).Log(this, "_rotation").ToProperty(this, e => e.Rotation); + + _logoPadding = this.WhenAnyValue( + e => e.MonitorsPresenter.VisualRatio.X, + e => e.MonitorsPresenter.VisualRatio.Y, + (x, y) => new Thickness(4 * x, 4 * y, 4 * x, 4 * y) + ).Log(this, "_logoPadding").ToProperty(this, e => e.LogoPadding); + + _left = this.WhenAnyValue( + e => e.MonitorsPresenter.VisualRatio.X, + e => e.Location.X, + e => e.MonitorsPresenter.Model.X0, + e => e.Model.DepthProjection.LeftBorder, + + (rx, x, x0, leftBorder) => rx * (x0 + x - leftBorder) + + ).Log(this, "_left").ToProperty(this, e => e.Left); + + _top = this.WhenAnyValue( + e => e.MonitorsPresenter.VisualRatio.Y, + e => e.Location.Y, + e => e.MonitorsPresenter.Model.Y0, + e => e.Model.DepthProjection.TopBorder, + + (ry, y, y0, topBorder) => ry * (y0 + y - topBorder) + + ).Log(this, "_top").ToProperty(this, e => e.Top); + + _margin = this.WhenAnyValue( + e => e.Left, + e => e.Top, (left, top) => new Thickness(Left, Top, 0, 0) + ).Log(this, "_margin").ToProperty(this, e => e.Margin); + + _unrotated = this.WhenAnyValue( + e => e.MonitorsPresenter.VisualRatio, + e => e.Model.DepthProjectionUnrotated, + e => e.Model.ActiveSource.Source.Orientation, + (ratio, mmu, o) => mmu.ScaleWithLocation(ratio) + ).Log(this, "_unrotated").ToProperty(this, e => e.Unrotated); + + var cmd = ReactiveCommand.CreateFromTask<(string, WallpaperStyle, Color)>(p => SetWallpaper(p.Item1, p.Item2, p.Item3)); + + this.WhenAnyValue( + e => e.Model.ActiveSource.Source.WallpaperPath, + e => e.Model.ActiveSource.Source.WallpaperStyle, + e => e.Model.ActiveSource.Source.BackgroundColor) + .InvokeCommand(cmd).DisposeWith(this); + + this + .WhenAnyValue(e => e.Model) + .Select(e => e) + .Do(e => Location = new FrameLocation(e)) + .Subscribe().DisposeWith(this); + + _selected = this.WhenAnyValue( + e => e.MonitorsPresenter.SelectedMonitor, + e => e.Model, + (selected, monitor) => selected == monitor + ) + .ToProperty(this, e => e.Selected); + + Disposer.OnDispose(() => + { + if (_wallpaper is IDisposable bmp) + { + bmp.Dispose(); + } + _wallpaper = null; + }); + } + + Rect GetBounds(int shrink) + { + Debug.Assert(Model?.Layout != null); + + var r = new Rect(); + foreach (var s in Model.Layout.PhysicalSources) + { + r = r.Union(s.Source.InPixel.Bounds); + } + + return new Rect(r.X / shrink, r.Y / shrink, r.Width / shrink, r.Height / shrink); + } + + async Task SetWallpaper(string path, WallpaperStyle style, Color color) + { + Debug.Assert(Model?.ActiveSource?.Source != null); + + if (string.IsNullOrWhiteSpace(path)) + { + Wallpaper = null; + return; + } + + //All dimensions are divided by this value to reduce memory usage + const int shrink = 4; + + var r = Model.ActiveSource.Source.InPixel.Bounds; - var monitor = new Rect(r.X/shrink,r.Y/shrink,r.Width/shrink,r.Height/shrink); - - Wallpaper = style switch - { - WallpaperStyle.Fill => await WallpaperRendererHelper.GetWallpaperFillAsync(path, monitor.Size, shrink), - WallpaperStyle.Fit => await WallpaperRendererHelper.GetWallpaperFitAsync(path, monitor.Size, color, shrink), + if (r.Width < shrink || r.Height < shrink) + { + Wallpaper = null; + return; + } - WallpaperStyle.Stretch => await WallpaperRendererHelper.GetWallpaperStretchAsync(path, monitor.Size, shrink), + var monitor = new Rect(r.X / shrink, r.Y / shrink, r.Width / shrink, r.Height / shrink); - WallpaperStyle.Tile => await WallpaperRendererHelper.GetWallpaperTileAsync(path, monitor, GetBounds(shrink), shrink), + Wallpaper = style switch + { + WallpaperStyle.Fill => await WallpaperRendererHelper.GetWallpaperFillAsync(path, monitor.Size, shrink), - WallpaperStyle.Center => await WallpaperRendererHelper.GetWallpaperCenterAsync(path, monitor.Size, color, shrink), + WallpaperStyle.Fit => await WallpaperRendererHelper.GetWallpaperFitAsync(path, monitor.Size, color, shrink), - WallpaperStyle.Span => await WallpaperRendererHelper.GetWallpaperSpanAsync(path, monitor, GetBounds(shrink), shrink), + WallpaperStyle.Stretch => await WallpaperRendererHelper.GetWallpaperStretchAsync(path, monitor.Size, shrink), - _ => throw new ArgumentOutOfRangeException() - }; - - #if DEBUG - WallpaperRendererHelper.ImageSharpDebugStats(); - #endif - } + WallpaperStyle.Tile => await WallpaperRendererHelper.GetWallpaperTileAsync(path, monitor, GetBounds(shrink), shrink), + WallpaperStyle.Center => await WallpaperRendererHelper.GetWallpaperCenterAsync(path, monitor.Size, color, shrink), - public IMonitorsLayoutPresenterViewModel? MonitorsPresenter - { - get => _monitorsPresenter; - set => this.RaiseAndSetIfChanged(ref _monitorsPresenter, value); - } - IMonitorsLayoutPresenterViewModel? _monitorsPresenter; - - public TransformGroup? Rotation => _rotation.Value; - readonly ObservableAsPropertyHelper _rotation; - - public Thickness LogoPadding => _logoPadding.Value; - readonly ObservableAsPropertyHelper _logoPadding; - - public Thickness Margin => _margin.Value; - readonly ObservableAsPropertyHelper _margin; - - public double Left => _left.Value; - readonly ObservableAsPropertyHelper _left; + WallpaperStyle.Span => await WallpaperRendererHelper.GetWallpaperSpanAsync(path, monitor, GetBounds(shrink), shrink), - public double Top => _top.Value; - readonly ObservableAsPropertyHelper _top; - - public IDisplaySize Rotated => _rotated.Value; - readonly ObservableAsPropertyHelper _rotated; + _ => throw new ArgumentOutOfRangeException() + }; - public IDisplaySize Unrotated => _unrotated.Value; - readonly ObservableAsPropertyHelper _unrotated; +#if DEBUG + WallpaperRendererHelper.ImageSharpDebugStats(); +#endif + } - public bool Selected => _selected.Value; - readonly ObservableAsPropertyHelper _selected; - public IImage? Wallpaper - { - get => _wallpaper; - set => this.RaiseAndSetIfChanged(ref _wallpaper, value); - } - IImage? _wallpaper; + public IMonitorsLayoutPresenterViewModel? MonitorsPresenter + { + get => _monitorsPresenter; + set => this.RaiseAndSetIfChanged(ref _monitorsPresenter, value); + } + IMonitorsLayoutPresenterViewModel? _monitorsPresenter; - public IFrameLocation Location - { - get => _location; - set => this.RaiseAndSetIfChanged(ref _location, value); - } - IFrameLocation _location; + public TransformGroup? Rotation => _rotation.Value; + readonly ObservableAsPropertyHelper _rotation; - public void ConfigureMvvmContext(IMvvmContext ctx) - { - ctx.AddCreator(e => e.MonitorFrameViewModel = this); - } + public Thickness LogoPadding => _logoPadding.Value; + readonly ObservableAsPropertyHelper _logoPadding; + + public Thickness Margin => _margin.Value; + readonly ObservableAsPropertyHelper _margin; + + public double Left => _left.Value; + readonly ObservableAsPropertyHelper _left; + + public double Top => _top.Value; + readonly ObservableAsPropertyHelper _top; + + public IDisplaySize Rotated => _rotated.Value; + readonly ObservableAsPropertyHelper _rotated; + + public IDisplaySize Unrotated => _unrotated.Value; + readonly ObservableAsPropertyHelper _unrotated; + + public bool Selected => _selected.Value; + readonly ObservableAsPropertyHelper _selected; + + public IImage? Wallpaper + { + get => _wallpaper; + set => this.RaiseAndSetIfChanged(ref _wallpaper, value); + } + IImage? _wallpaper; + + public IFrameLocation Location + { + get => _location; + set => this.RaiseAndSetIfChanged(ref _location, value); + } + IFrameLocation _location; + + public void ConfigureMvvmContext(IMvvmContext ctx) + { + ctx.AddCreator(e => e.MonitorFrameViewModel = this); + } } \ No newline at end of file diff --git a/LittleBigMouse.Ui/LittleBigMouse.Ui.Avalonia/Remote/LittleBigMouseClientService.cs b/LittleBigMouse.Ui/LittleBigMouse.Ui.Avalonia/Remote/LittleBigMouseClientService.cs index 2af8d8b2..49613493 100644 --- a/LittleBigMouse.Ui/LittleBigMouse.Ui.Avalonia/Remote/LittleBigMouseClientService.cs +++ b/LittleBigMouse.Ui/LittleBigMouse.Ui.Avalonia/Remote/LittleBigMouseClientService.cs @@ -160,7 +160,7 @@ public void LaunchDaemon() Debug.WriteLine($"Started : {process.ProcessName} {process.Id}"); } - catch (ExecutionEngineException ex) + catch (Exception ex) { } diff --git a/LittleBigMouse.sln b/LittleBigMouse.sln index 7d391115..83c44604 100644 --- a/LittleBigMouse.sln +++ b/LittleBigMouse.sln @@ -127,700 +127,161 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LittleBigMouse.Server", "Li EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - DebugRelease|Any CPU = DebugRelease|Any CPU - DebugRelease|x64 = DebugRelease|x64 - DebugRelease|x86 = DebugRelease|x86 - Release|Any CPU = Release|Any CPU Release|x64 = Release|x64 - Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {EDC4FE17-EDAE-42B1-80E4-FB5273F43D11}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EDC4FE17-EDAE-42B1-80E4-FB5273F43D11}.Debug|Any CPU.Build.0 = Debug|Any CPU {EDC4FE17-EDAE-42B1-80E4-FB5273F43D11}.Debug|x64.ActiveCfg = Debug|x64 {EDC4FE17-EDAE-42B1-80E4-FB5273F43D11}.Debug|x64.Build.0 = Debug|x64 - {EDC4FE17-EDAE-42B1-80E4-FB5273F43D11}.Debug|x86.ActiveCfg = Debug|x86 - {EDC4FE17-EDAE-42B1-80E4-FB5273F43D11}.Debug|x86.Build.0 = Debug|x86 - {EDC4FE17-EDAE-42B1-80E4-FB5273F43D11}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {EDC4FE17-EDAE-42B1-80E4-FB5273F43D11}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {EDC4FE17-EDAE-42B1-80E4-FB5273F43D11}.DebugRelease|x64.ActiveCfg = Release|x64 - {EDC4FE17-EDAE-42B1-80E4-FB5273F43D11}.DebugRelease|x64.Build.0 = Release|x64 - {EDC4FE17-EDAE-42B1-80E4-FB5273F43D11}.DebugRelease|x86.ActiveCfg = Release|x86 - {EDC4FE17-EDAE-42B1-80E4-FB5273F43D11}.DebugRelease|x86.Build.0 = Release|x86 - {EDC4FE17-EDAE-42B1-80E4-FB5273F43D11}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EDC4FE17-EDAE-42B1-80E4-FB5273F43D11}.Release|Any CPU.Build.0 = Release|Any CPU {EDC4FE17-EDAE-42B1-80E4-FB5273F43D11}.Release|x64.ActiveCfg = Release|x64 {EDC4FE17-EDAE-42B1-80E4-FB5273F43D11}.Release|x64.Build.0 = Release|x64 - {EDC4FE17-EDAE-42B1-80E4-FB5273F43D11}.Release|x86.ActiveCfg = Release|x86 - {EDC4FE17-EDAE-42B1-80E4-FB5273F43D11}.Release|x86.Build.0 = Release|x86 - {A3EAAA24-5913-471E-ADB1-402F64536A63}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A3EAAA24-5913-471E-ADB1-402F64536A63}.Debug|Any CPU.Build.0 = Debug|Any CPU {A3EAAA24-5913-471E-ADB1-402F64536A63}.Debug|x64.ActiveCfg = Debug|x64 {A3EAAA24-5913-471E-ADB1-402F64536A63}.Debug|x64.Build.0 = Debug|x64 - {A3EAAA24-5913-471E-ADB1-402F64536A63}.Debug|x86.ActiveCfg = Debug|x86 - {A3EAAA24-5913-471E-ADB1-402F64536A63}.Debug|x86.Build.0 = Debug|x86 - {A3EAAA24-5913-471E-ADB1-402F64536A63}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {A3EAAA24-5913-471E-ADB1-402F64536A63}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {A3EAAA24-5913-471E-ADB1-402F64536A63}.DebugRelease|x64.ActiveCfg = Release|x64 - {A3EAAA24-5913-471E-ADB1-402F64536A63}.DebugRelease|x64.Build.0 = Release|x64 - {A3EAAA24-5913-471E-ADB1-402F64536A63}.DebugRelease|x86.ActiveCfg = Release|x86 - {A3EAAA24-5913-471E-ADB1-402F64536A63}.DebugRelease|x86.Build.0 = Release|x86 - {A3EAAA24-5913-471E-ADB1-402F64536A63}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A3EAAA24-5913-471E-ADB1-402F64536A63}.Release|Any CPU.Build.0 = Release|Any CPU {A3EAAA24-5913-471E-ADB1-402F64536A63}.Release|x64.ActiveCfg = Release|x64 {A3EAAA24-5913-471E-ADB1-402F64536A63}.Release|x64.Build.0 = Release|x64 - {A3EAAA24-5913-471E-ADB1-402F64536A63}.Release|x86.ActiveCfg = Release|x86 - {A3EAAA24-5913-471E-ADB1-402F64536A63}.Release|x86.Build.0 = Release|x86 - {17CFFA1D-3C93-4ECF-9B0A-27DE5D71DD90}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {17CFFA1D-3C93-4ECF-9B0A-27DE5D71DD90}.Debug|Any CPU.Build.0 = Debug|Any CPU {17CFFA1D-3C93-4ECF-9B0A-27DE5D71DD90}.Debug|x64.ActiveCfg = Debug|x64 {17CFFA1D-3C93-4ECF-9B0A-27DE5D71DD90}.Debug|x64.Build.0 = Debug|x64 - {17CFFA1D-3C93-4ECF-9B0A-27DE5D71DD90}.Debug|x86.ActiveCfg = Debug|x86 - {17CFFA1D-3C93-4ECF-9B0A-27DE5D71DD90}.Debug|x86.Build.0 = Debug|x86 - {17CFFA1D-3C93-4ECF-9B0A-27DE5D71DD90}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {17CFFA1D-3C93-4ECF-9B0A-27DE5D71DD90}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {17CFFA1D-3C93-4ECF-9B0A-27DE5D71DD90}.DebugRelease|x64.ActiveCfg = Release|x64 - {17CFFA1D-3C93-4ECF-9B0A-27DE5D71DD90}.DebugRelease|x64.Build.0 = Release|x64 - {17CFFA1D-3C93-4ECF-9B0A-27DE5D71DD90}.DebugRelease|x86.ActiveCfg = Release|x86 - {17CFFA1D-3C93-4ECF-9B0A-27DE5D71DD90}.DebugRelease|x86.Build.0 = Release|x86 - {17CFFA1D-3C93-4ECF-9B0A-27DE5D71DD90}.Release|Any CPU.ActiveCfg = Release|Any CPU - {17CFFA1D-3C93-4ECF-9B0A-27DE5D71DD90}.Release|Any CPU.Build.0 = Release|Any CPU {17CFFA1D-3C93-4ECF-9B0A-27DE5D71DD90}.Release|x64.ActiveCfg = Release|x64 {17CFFA1D-3C93-4ECF-9B0A-27DE5D71DD90}.Release|x64.Build.0 = Release|x64 - {17CFFA1D-3C93-4ECF-9B0A-27DE5D71DD90}.Release|x86.ActiveCfg = Release|x86 - {17CFFA1D-3C93-4ECF-9B0A-27DE5D71DD90}.Release|x86.Build.0 = Release|x86 - {10C3B514-5F74-4428-A36B-7B9B1BB5C789}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {10C3B514-5F74-4428-A36B-7B9B1BB5C789}.Debug|Any CPU.Build.0 = Debug|Any CPU {10C3B514-5F74-4428-A36B-7B9B1BB5C789}.Debug|x64.ActiveCfg = Debug|x64 {10C3B514-5F74-4428-A36B-7B9B1BB5C789}.Debug|x64.Build.0 = Debug|x64 - {10C3B514-5F74-4428-A36B-7B9B1BB5C789}.Debug|x86.ActiveCfg = Debug|x86 - {10C3B514-5F74-4428-A36B-7B9B1BB5C789}.Debug|x86.Build.0 = Debug|x86 - {10C3B514-5F74-4428-A36B-7B9B1BB5C789}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {10C3B514-5F74-4428-A36B-7B9B1BB5C789}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {10C3B514-5F74-4428-A36B-7B9B1BB5C789}.DebugRelease|x64.ActiveCfg = Release|x64 - {10C3B514-5F74-4428-A36B-7B9B1BB5C789}.DebugRelease|x64.Build.0 = Release|x64 - {10C3B514-5F74-4428-A36B-7B9B1BB5C789}.DebugRelease|x86.ActiveCfg = Release|x86 - {10C3B514-5F74-4428-A36B-7B9B1BB5C789}.DebugRelease|x86.Build.0 = Release|x86 - {10C3B514-5F74-4428-A36B-7B9B1BB5C789}.Release|Any CPU.ActiveCfg = Release|Any CPU - {10C3B514-5F74-4428-A36B-7B9B1BB5C789}.Release|Any CPU.Build.0 = Release|Any CPU {10C3B514-5F74-4428-A36B-7B9B1BB5C789}.Release|x64.ActiveCfg = Release|x64 {10C3B514-5F74-4428-A36B-7B9B1BB5C789}.Release|x64.Build.0 = Release|x64 - {10C3B514-5F74-4428-A36B-7B9B1BB5C789}.Release|x86.ActiveCfg = Release|x86 - {10C3B514-5F74-4428-A36B-7B9B1BB5C789}.Release|x86.Build.0 = Release|x86 - {E2FF593A-E2D4-45F7-B53A-3AF3F7199E6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E2FF593A-E2D4-45F7-B53A-3AF3F7199E6A}.Debug|Any CPU.Build.0 = Debug|Any CPU {E2FF593A-E2D4-45F7-B53A-3AF3F7199E6A}.Debug|x64.ActiveCfg = Debug|x64 {E2FF593A-E2D4-45F7-B53A-3AF3F7199E6A}.Debug|x64.Build.0 = Debug|x64 - {E2FF593A-E2D4-45F7-B53A-3AF3F7199E6A}.Debug|x86.ActiveCfg = Debug|x86 - {E2FF593A-E2D4-45F7-B53A-3AF3F7199E6A}.Debug|x86.Build.0 = Debug|x86 - {E2FF593A-E2D4-45F7-B53A-3AF3F7199E6A}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {E2FF593A-E2D4-45F7-B53A-3AF3F7199E6A}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {E2FF593A-E2D4-45F7-B53A-3AF3F7199E6A}.DebugRelease|x64.ActiveCfg = Release|x64 - {E2FF593A-E2D4-45F7-B53A-3AF3F7199E6A}.DebugRelease|x64.Build.0 = Release|x64 - {E2FF593A-E2D4-45F7-B53A-3AF3F7199E6A}.DebugRelease|x86.ActiveCfg = Release|x86 - {E2FF593A-E2D4-45F7-B53A-3AF3F7199E6A}.DebugRelease|x86.Build.0 = Release|x86 - {E2FF593A-E2D4-45F7-B53A-3AF3F7199E6A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E2FF593A-E2D4-45F7-B53A-3AF3F7199E6A}.Release|Any CPU.Build.0 = Release|Any CPU {E2FF593A-E2D4-45F7-B53A-3AF3F7199E6A}.Release|x64.ActiveCfg = Release|x64 {E2FF593A-E2D4-45F7-B53A-3AF3F7199E6A}.Release|x64.Build.0 = Release|x64 - {E2FF593A-E2D4-45F7-B53A-3AF3F7199E6A}.Release|x86.ActiveCfg = Release|x86 - {E2FF593A-E2D4-45F7-B53A-3AF3F7199E6A}.Release|x86.Build.0 = Release|x86 - {057E0D7A-5412-4E1E-B40E-16E0EEA5D993}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {057E0D7A-5412-4E1E-B40E-16E0EEA5D993}.Debug|Any CPU.Build.0 = Debug|Any CPU {057E0D7A-5412-4E1E-B40E-16E0EEA5D993}.Debug|x64.ActiveCfg = Debug|x64 {057E0D7A-5412-4E1E-B40E-16E0EEA5D993}.Debug|x64.Build.0 = Debug|x64 - {057E0D7A-5412-4E1E-B40E-16E0EEA5D993}.Debug|x86.ActiveCfg = Debug|x86 - {057E0D7A-5412-4E1E-B40E-16E0EEA5D993}.Debug|x86.Build.0 = Debug|x86 - {057E0D7A-5412-4E1E-B40E-16E0EEA5D993}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {057E0D7A-5412-4E1E-B40E-16E0EEA5D993}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {057E0D7A-5412-4E1E-B40E-16E0EEA5D993}.DebugRelease|x64.ActiveCfg = Release|x64 - {057E0D7A-5412-4E1E-B40E-16E0EEA5D993}.DebugRelease|x64.Build.0 = Release|x64 - {057E0D7A-5412-4E1E-B40E-16E0EEA5D993}.DebugRelease|x86.ActiveCfg = Release|x86 - {057E0D7A-5412-4E1E-B40E-16E0EEA5D993}.DebugRelease|x86.Build.0 = Release|x86 - {057E0D7A-5412-4E1E-B40E-16E0EEA5D993}.Release|Any CPU.ActiveCfg = Release|Any CPU - {057E0D7A-5412-4E1E-B40E-16E0EEA5D993}.Release|Any CPU.Build.0 = Release|Any CPU {057E0D7A-5412-4E1E-B40E-16E0EEA5D993}.Release|x64.ActiveCfg = Release|x64 {057E0D7A-5412-4E1E-B40E-16E0EEA5D993}.Release|x64.Build.0 = Release|x64 - {057E0D7A-5412-4E1E-B40E-16E0EEA5D993}.Release|x86.ActiveCfg = Release|x86 - {057E0D7A-5412-4E1E-B40E-16E0EEA5D993}.Release|x86.Build.0 = Release|x86 - {79B8687D-99C6-4176-B605-2419BF479AB4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {79B8687D-99C6-4176-B605-2419BF479AB4}.Debug|Any CPU.Build.0 = Debug|Any CPU {79B8687D-99C6-4176-B605-2419BF479AB4}.Debug|x64.ActiveCfg = Debug|x64 {79B8687D-99C6-4176-B605-2419BF479AB4}.Debug|x64.Build.0 = Debug|x64 - {79B8687D-99C6-4176-B605-2419BF479AB4}.Debug|x86.ActiveCfg = Debug|x86 - {79B8687D-99C6-4176-B605-2419BF479AB4}.Debug|x86.Build.0 = Debug|x86 - {79B8687D-99C6-4176-B605-2419BF479AB4}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {79B8687D-99C6-4176-B605-2419BF479AB4}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {79B8687D-99C6-4176-B605-2419BF479AB4}.DebugRelease|x64.ActiveCfg = Release|x64 - {79B8687D-99C6-4176-B605-2419BF479AB4}.DebugRelease|x64.Build.0 = Release|x64 - {79B8687D-99C6-4176-B605-2419BF479AB4}.DebugRelease|x86.ActiveCfg = Release|x86 - {79B8687D-99C6-4176-B605-2419BF479AB4}.DebugRelease|x86.Build.0 = Release|x86 - {79B8687D-99C6-4176-B605-2419BF479AB4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {79B8687D-99C6-4176-B605-2419BF479AB4}.Release|Any CPU.Build.0 = Release|Any CPU {79B8687D-99C6-4176-B605-2419BF479AB4}.Release|x64.ActiveCfg = Release|x64 {79B8687D-99C6-4176-B605-2419BF479AB4}.Release|x64.Build.0 = Release|x64 - {79B8687D-99C6-4176-B605-2419BF479AB4}.Release|x86.ActiveCfg = Release|x86 - {79B8687D-99C6-4176-B605-2419BF479AB4}.Release|x86.Build.0 = Release|x86 - {379E61B9-F045-44D6-BC5D-53F2B83A60ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {379E61B9-F045-44D6-BC5D-53F2B83A60ED}.Debug|Any CPU.Build.0 = Debug|Any CPU {379E61B9-F045-44D6-BC5D-53F2B83A60ED}.Debug|x64.ActiveCfg = Debug|x64 {379E61B9-F045-44D6-BC5D-53F2B83A60ED}.Debug|x64.Build.0 = Debug|x64 - {379E61B9-F045-44D6-BC5D-53F2B83A60ED}.Debug|x86.ActiveCfg = Debug|x86 - {379E61B9-F045-44D6-BC5D-53F2B83A60ED}.Debug|x86.Build.0 = Debug|x86 - {379E61B9-F045-44D6-BC5D-53F2B83A60ED}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {379E61B9-F045-44D6-BC5D-53F2B83A60ED}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {379E61B9-F045-44D6-BC5D-53F2B83A60ED}.DebugRelease|x64.ActiveCfg = Release|x64 - {379E61B9-F045-44D6-BC5D-53F2B83A60ED}.DebugRelease|x64.Build.0 = Release|x64 - {379E61B9-F045-44D6-BC5D-53F2B83A60ED}.DebugRelease|x86.ActiveCfg = Release|x86 - {379E61B9-F045-44D6-BC5D-53F2B83A60ED}.DebugRelease|x86.Build.0 = Release|x86 - {379E61B9-F045-44D6-BC5D-53F2B83A60ED}.Release|Any CPU.ActiveCfg = Release|Any CPU - {379E61B9-F045-44D6-BC5D-53F2B83A60ED}.Release|Any CPU.Build.0 = Release|Any CPU {379E61B9-F045-44D6-BC5D-53F2B83A60ED}.Release|x64.ActiveCfg = Release|x64 {379E61B9-F045-44D6-BC5D-53F2B83A60ED}.Release|x64.Build.0 = Release|x64 - {379E61B9-F045-44D6-BC5D-53F2B83A60ED}.Release|x86.ActiveCfg = Release|x86 - {379E61B9-F045-44D6-BC5D-53F2B83A60ED}.Release|x86.Build.0 = Release|x86 - {957C1A05-46D6-4D2A-B11B-4963A5AD6766}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {957C1A05-46D6-4D2A-B11B-4963A5AD6766}.Debug|Any CPU.Build.0 = Debug|Any CPU {957C1A05-46D6-4D2A-B11B-4963A5AD6766}.Debug|x64.ActiveCfg = Debug|x64 {957C1A05-46D6-4D2A-B11B-4963A5AD6766}.Debug|x64.Build.0 = Debug|x64 - {957C1A05-46D6-4D2A-B11B-4963A5AD6766}.Debug|x86.ActiveCfg = Debug|x86 - {957C1A05-46D6-4D2A-B11B-4963A5AD6766}.Debug|x86.Build.0 = Debug|x86 - {957C1A05-46D6-4D2A-B11B-4963A5AD6766}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {957C1A05-46D6-4D2A-B11B-4963A5AD6766}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {957C1A05-46D6-4D2A-B11B-4963A5AD6766}.DebugRelease|x64.ActiveCfg = Release|x64 - {957C1A05-46D6-4D2A-B11B-4963A5AD6766}.DebugRelease|x64.Build.0 = Release|x64 - {957C1A05-46D6-4D2A-B11B-4963A5AD6766}.DebugRelease|x86.ActiveCfg = Release|x86 - {957C1A05-46D6-4D2A-B11B-4963A5AD6766}.DebugRelease|x86.Build.0 = Release|x86 - {957C1A05-46D6-4D2A-B11B-4963A5AD6766}.Release|Any CPU.ActiveCfg = Release|Any CPU - {957C1A05-46D6-4D2A-B11B-4963A5AD6766}.Release|Any CPU.Build.0 = Release|Any CPU {957C1A05-46D6-4D2A-B11B-4963A5AD6766}.Release|x64.ActiveCfg = Release|x64 {957C1A05-46D6-4D2A-B11B-4963A5AD6766}.Release|x64.Build.0 = Release|x64 - {957C1A05-46D6-4D2A-B11B-4963A5AD6766}.Release|x86.ActiveCfg = Release|x86 - {957C1A05-46D6-4D2A-B11B-4963A5AD6766}.Release|x86.Build.0 = Release|x86 - {7A947291-EFE1-42D9-B51C-A0B09B0B0CD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7A947291-EFE1-42D9-B51C-A0B09B0B0CD7}.Debug|Any CPU.Build.0 = Debug|Any CPU {7A947291-EFE1-42D9-B51C-A0B09B0B0CD7}.Debug|x64.ActiveCfg = Debug|x64 {7A947291-EFE1-42D9-B51C-A0B09B0B0CD7}.Debug|x64.Build.0 = Debug|x64 - {7A947291-EFE1-42D9-B51C-A0B09B0B0CD7}.Debug|x86.ActiveCfg = Debug|x86 - {7A947291-EFE1-42D9-B51C-A0B09B0B0CD7}.Debug|x86.Build.0 = Debug|x86 - {7A947291-EFE1-42D9-B51C-A0B09B0B0CD7}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {7A947291-EFE1-42D9-B51C-A0B09B0B0CD7}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {7A947291-EFE1-42D9-B51C-A0B09B0B0CD7}.DebugRelease|x64.ActiveCfg = Release|x64 - {7A947291-EFE1-42D9-B51C-A0B09B0B0CD7}.DebugRelease|x64.Build.0 = Release|x64 - {7A947291-EFE1-42D9-B51C-A0B09B0B0CD7}.DebugRelease|x86.ActiveCfg = Release|x86 - {7A947291-EFE1-42D9-B51C-A0B09B0B0CD7}.DebugRelease|x86.Build.0 = Release|x86 - {7A947291-EFE1-42D9-B51C-A0B09B0B0CD7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7A947291-EFE1-42D9-B51C-A0B09B0B0CD7}.Release|Any CPU.Build.0 = Release|Any CPU {7A947291-EFE1-42D9-B51C-A0B09B0B0CD7}.Release|x64.ActiveCfg = Release|x64 {7A947291-EFE1-42D9-B51C-A0B09B0B0CD7}.Release|x64.Build.0 = Release|x64 - {7A947291-EFE1-42D9-B51C-A0B09B0B0CD7}.Release|x86.ActiveCfg = Release|x86 - {7A947291-EFE1-42D9-B51C-A0B09B0B0CD7}.Release|x86.Build.0 = Release|x86 - {E7DF4999-DE60-444D-810B-DCF4195AE798}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E7DF4999-DE60-444D-810B-DCF4195AE798}.Debug|Any CPU.Build.0 = Debug|Any CPU {E7DF4999-DE60-444D-810B-DCF4195AE798}.Debug|x64.ActiveCfg = Debug|x64 {E7DF4999-DE60-444D-810B-DCF4195AE798}.Debug|x64.Build.0 = Debug|x64 - {E7DF4999-DE60-444D-810B-DCF4195AE798}.Debug|x86.ActiveCfg = Debug|x86 - {E7DF4999-DE60-444D-810B-DCF4195AE798}.Debug|x86.Build.0 = Debug|x86 - {E7DF4999-DE60-444D-810B-DCF4195AE798}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {E7DF4999-DE60-444D-810B-DCF4195AE798}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {E7DF4999-DE60-444D-810B-DCF4195AE798}.DebugRelease|x64.ActiveCfg = Release|x64 - {E7DF4999-DE60-444D-810B-DCF4195AE798}.DebugRelease|x64.Build.0 = Release|x64 - {E7DF4999-DE60-444D-810B-DCF4195AE798}.DebugRelease|x86.ActiveCfg = Release|x86 - {E7DF4999-DE60-444D-810B-DCF4195AE798}.DebugRelease|x86.Build.0 = Release|x86 - {E7DF4999-DE60-444D-810B-DCF4195AE798}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E7DF4999-DE60-444D-810B-DCF4195AE798}.Release|Any CPU.Build.0 = Release|Any CPU {E7DF4999-DE60-444D-810B-DCF4195AE798}.Release|x64.ActiveCfg = Release|x64 {E7DF4999-DE60-444D-810B-DCF4195AE798}.Release|x64.Build.0 = Release|x64 - {E7DF4999-DE60-444D-810B-DCF4195AE798}.Release|x86.ActiveCfg = Release|x86 - {E7DF4999-DE60-444D-810B-DCF4195AE798}.Release|x86.Build.0 = Release|x86 - {519B1F78-EF51-43B8-A611-78C45F9E1935}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {519B1F78-EF51-43B8-A611-78C45F9E1935}.Debug|Any CPU.Build.0 = Debug|Any CPU {519B1F78-EF51-43B8-A611-78C45F9E1935}.Debug|x64.ActiveCfg = Debug|x64 {519B1F78-EF51-43B8-A611-78C45F9E1935}.Debug|x64.Build.0 = Debug|x64 - {519B1F78-EF51-43B8-A611-78C45F9E1935}.Debug|x86.ActiveCfg = Debug|x86 - {519B1F78-EF51-43B8-A611-78C45F9E1935}.Debug|x86.Build.0 = Debug|x86 - {519B1F78-EF51-43B8-A611-78C45F9E1935}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {519B1F78-EF51-43B8-A611-78C45F9E1935}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {519B1F78-EF51-43B8-A611-78C45F9E1935}.DebugRelease|x64.ActiveCfg = Release|x64 - {519B1F78-EF51-43B8-A611-78C45F9E1935}.DebugRelease|x64.Build.0 = Release|x64 - {519B1F78-EF51-43B8-A611-78C45F9E1935}.DebugRelease|x86.ActiveCfg = Release|x86 - {519B1F78-EF51-43B8-A611-78C45F9E1935}.DebugRelease|x86.Build.0 = Release|x86 - {519B1F78-EF51-43B8-A611-78C45F9E1935}.Release|Any CPU.ActiveCfg = Release|Any CPU - {519B1F78-EF51-43B8-A611-78C45F9E1935}.Release|Any CPU.Build.0 = Release|Any CPU {519B1F78-EF51-43B8-A611-78C45F9E1935}.Release|x64.ActiveCfg = Release|x64 {519B1F78-EF51-43B8-A611-78C45F9E1935}.Release|x64.Build.0 = Release|x64 - {519B1F78-EF51-43B8-A611-78C45F9E1935}.Release|x86.ActiveCfg = Release|x86 - {519B1F78-EF51-43B8-A611-78C45F9E1935}.Release|x86.Build.0 = Release|x86 - {7961E60C-E160-42A1-AA9F-9B1C05161347}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7961E60C-E160-42A1-AA9F-9B1C05161347}.Debug|Any CPU.Build.0 = Debug|Any CPU {7961E60C-E160-42A1-AA9F-9B1C05161347}.Debug|x64.ActiveCfg = Debug|x64 {7961E60C-E160-42A1-AA9F-9B1C05161347}.Debug|x64.Build.0 = Debug|x64 - {7961E60C-E160-42A1-AA9F-9B1C05161347}.Debug|x86.ActiveCfg = Debug|x86 - {7961E60C-E160-42A1-AA9F-9B1C05161347}.Debug|x86.Build.0 = Debug|x86 - {7961E60C-E160-42A1-AA9F-9B1C05161347}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {7961E60C-E160-42A1-AA9F-9B1C05161347}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {7961E60C-E160-42A1-AA9F-9B1C05161347}.DebugRelease|x64.ActiveCfg = Release|x64 - {7961E60C-E160-42A1-AA9F-9B1C05161347}.DebugRelease|x64.Build.0 = Release|x64 - {7961E60C-E160-42A1-AA9F-9B1C05161347}.DebugRelease|x86.ActiveCfg = Release|x86 - {7961E60C-E160-42A1-AA9F-9B1C05161347}.DebugRelease|x86.Build.0 = Release|x86 - {7961E60C-E160-42A1-AA9F-9B1C05161347}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7961E60C-E160-42A1-AA9F-9B1C05161347}.Release|Any CPU.Build.0 = Release|Any CPU {7961E60C-E160-42A1-AA9F-9B1C05161347}.Release|x64.ActiveCfg = Release|x64 {7961E60C-E160-42A1-AA9F-9B1C05161347}.Release|x64.Build.0 = Release|x64 - {7961E60C-E160-42A1-AA9F-9B1C05161347}.Release|x86.ActiveCfg = Release|x86 - {7961E60C-E160-42A1-AA9F-9B1C05161347}.Release|x86.Build.0 = Release|x86 - {FE78C54E-3C88-4A62-B1DF-96B86AC009F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FE78C54E-3C88-4A62-B1DF-96B86AC009F6}.Debug|Any CPU.Build.0 = Debug|Any CPU {FE78C54E-3C88-4A62-B1DF-96B86AC009F6}.Debug|x64.ActiveCfg = Debug|x64 {FE78C54E-3C88-4A62-B1DF-96B86AC009F6}.Debug|x64.Build.0 = Debug|x64 - {FE78C54E-3C88-4A62-B1DF-96B86AC009F6}.Debug|x86.ActiveCfg = Debug|x86 - {FE78C54E-3C88-4A62-B1DF-96B86AC009F6}.Debug|x86.Build.0 = Debug|x86 - {FE78C54E-3C88-4A62-B1DF-96B86AC009F6}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {FE78C54E-3C88-4A62-B1DF-96B86AC009F6}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {FE78C54E-3C88-4A62-B1DF-96B86AC009F6}.DebugRelease|x64.ActiveCfg = Release|x64 - {FE78C54E-3C88-4A62-B1DF-96B86AC009F6}.DebugRelease|x64.Build.0 = Release|x64 - {FE78C54E-3C88-4A62-B1DF-96B86AC009F6}.DebugRelease|x86.ActiveCfg = Release|x86 - {FE78C54E-3C88-4A62-B1DF-96B86AC009F6}.DebugRelease|x86.Build.0 = Release|x86 - {FE78C54E-3C88-4A62-B1DF-96B86AC009F6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FE78C54E-3C88-4A62-B1DF-96B86AC009F6}.Release|Any CPU.Build.0 = Release|Any CPU {FE78C54E-3C88-4A62-B1DF-96B86AC009F6}.Release|x64.ActiveCfg = Release|x64 {FE78C54E-3C88-4A62-B1DF-96B86AC009F6}.Release|x64.Build.0 = Release|x64 - {FE78C54E-3C88-4A62-B1DF-96B86AC009F6}.Release|x86.ActiveCfg = Release|x86 - {FE78C54E-3C88-4A62-B1DF-96B86AC009F6}.Release|x86.Build.0 = Release|x86 - {CB83115D-78BA-490D-AABD-31949F013F78}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {CB83115D-78BA-490D-AABD-31949F013F78}.Debug|Any CPU.Build.0 = Debug|Win32 {CB83115D-78BA-490D-AABD-31949F013F78}.Debug|x64.ActiveCfg = Debug|x64 - {CB83115D-78BA-490D-AABD-31949F013F78}.Debug|x86.ActiveCfg = Debug|Win32 - {CB83115D-78BA-490D-AABD-31949F013F78}.Debug|x86.Build.0 = Debug|Win32 - {CB83115D-78BA-490D-AABD-31949F013F78}.DebugRelease|Any CPU.ActiveCfg = Release|x64 - {CB83115D-78BA-490D-AABD-31949F013F78}.DebugRelease|Any CPU.Build.0 = Release|x64 - {CB83115D-78BA-490D-AABD-31949F013F78}.DebugRelease|x64.ActiveCfg = Release|x64 - {CB83115D-78BA-490D-AABD-31949F013F78}.DebugRelease|x64.Build.0 = Release|x64 - {CB83115D-78BA-490D-AABD-31949F013F78}.DebugRelease|x86.ActiveCfg = Release|Win32 - {CB83115D-78BA-490D-AABD-31949F013F78}.DebugRelease|x86.Build.0 = Release|Win32 - {CB83115D-78BA-490D-AABD-31949F013F78}.Release|Any CPU.ActiveCfg = Release|Win32 - {CB83115D-78BA-490D-AABD-31949F013F78}.Release|Any CPU.Build.0 = Release|Win32 {CB83115D-78BA-490D-AABD-31949F013F78}.Release|x64.ActiveCfg = Release|x64 {CB83115D-78BA-490D-AABD-31949F013F78}.Release|x64.Build.0 = Release|x64 - {CB83115D-78BA-490D-AABD-31949F013F78}.Release|x86.ActiveCfg = Release|Win32 - {CB83115D-78BA-490D-AABD-31949F013F78}.Release|x86.Build.0 = Release|Win32 - {C7FA38D2-42A1-4AD4-8EB2-B9BC9414E321}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C7FA38D2-42A1-4AD4-8EB2-B9BC9414E321}.Debug|Any CPU.Build.0 = Debug|Any CPU {C7FA38D2-42A1-4AD4-8EB2-B9BC9414E321}.Debug|x64.ActiveCfg = Debug|x64 {C7FA38D2-42A1-4AD4-8EB2-B9BC9414E321}.Debug|x64.Build.0 = Debug|x64 - {C7FA38D2-42A1-4AD4-8EB2-B9BC9414E321}.Debug|x86.ActiveCfg = Debug|x86 - {C7FA38D2-42A1-4AD4-8EB2-B9BC9414E321}.Debug|x86.Build.0 = Debug|x86 - {C7FA38D2-42A1-4AD4-8EB2-B9BC9414E321}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {C7FA38D2-42A1-4AD4-8EB2-B9BC9414E321}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {C7FA38D2-42A1-4AD4-8EB2-B9BC9414E321}.DebugRelease|x64.ActiveCfg = Release|x64 - {C7FA38D2-42A1-4AD4-8EB2-B9BC9414E321}.DebugRelease|x64.Build.0 = Release|x64 - {C7FA38D2-42A1-4AD4-8EB2-B9BC9414E321}.DebugRelease|x86.ActiveCfg = Release|x86 - {C7FA38D2-42A1-4AD4-8EB2-B9BC9414E321}.DebugRelease|x86.Build.0 = Release|x86 - {C7FA38D2-42A1-4AD4-8EB2-B9BC9414E321}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C7FA38D2-42A1-4AD4-8EB2-B9BC9414E321}.Release|Any CPU.Build.0 = Release|Any CPU {C7FA38D2-42A1-4AD4-8EB2-B9BC9414E321}.Release|x64.ActiveCfg = Release|x64 {C7FA38D2-42A1-4AD4-8EB2-B9BC9414E321}.Release|x64.Build.0 = Release|x64 - {C7FA38D2-42A1-4AD4-8EB2-B9BC9414E321}.Release|x86.ActiveCfg = Release|x86 - {C7FA38D2-42A1-4AD4-8EB2-B9BC9414E321}.Release|x86.Build.0 = Release|x86 - {3C7B0355-16BC-406F-89BC-229D62D8654B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3C7B0355-16BC-406F-89BC-229D62D8654B}.Debug|Any CPU.Build.0 = Debug|Any CPU {3C7B0355-16BC-406F-89BC-229D62D8654B}.Debug|x64.ActiveCfg = Debug|x64 {3C7B0355-16BC-406F-89BC-229D62D8654B}.Debug|x64.Build.0 = Debug|x64 - {3C7B0355-16BC-406F-89BC-229D62D8654B}.Debug|x86.ActiveCfg = Debug|x86 - {3C7B0355-16BC-406F-89BC-229D62D8654B}.Debug|x86.Build.0 = Debug|x86 - {3C7B0355-16BC-406F-89BC-229D62D8654B}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {3C7B0355-16BC-406F-89BC-229D62D8654B}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {3C7B0355-16BC-406F-89BC-229D62D8654B}.DebugRelease|x64.ActiveCfg = Release|x64 - {3C7B0355-16BC-406F-89BC-229D62D8654B}.DebugRelease|x64.Build.0 = Release|x64 - {3C7B0355-16BC-406F-89BC-229D62D8654B}.DebugRelease|x86.ActiveCfg = Release|x86 - {3C7B0355-16BC-406F-89BC-229D62D8654B}.DebugRelease|x86.Build.0 = Release|x86 - {3C7B0355-16BC-406F-89BC-229D62D8654B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3C7B0355-16BC-406F-89BC-229D62D8654B}.Release|Any CPU.Build.0 = Release|Any CPU {3C7B0355-16BC-406F-89BC-229D62D8654B}.Release|x64.ActiveCfg = Release|x64 {3C7B0355-16BC-406F-89BC-229D62D8654B}.Release|x64.Build.0 = Release|x64 - {3C7B0355-16BC-406F-89BC-229D62D8654B}.Release|x86.ActiveCfg = Release|x86 - {3C7B0355-16BC-406F-89BC-229D62D8654B}.Release|x86.Build.0 = Release|x86 - {C6BD898B-B32A-417C-9529-B25877139EE1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C6BD898B-B32A-417C-9529-B25877139EE1}.Debug|Any CPU.Build.0 = Debug|Any CPU {C6BD898B-B32A-417C-9529-B25877139EE1}.Debug|x64.ActiveCfg = Debug|x64 {C6BD898B-B32A-417C-9529-B25877139EE1}.Debug|x64.Build.0 = Debug|x64 - {C6BD898B-B32A-417C-9529-B25877139EE1}.Debug|x86.ActiveCfg = Debug|x86 - {C6BD898B-B32A-417C-9529-B25877139EE1}.Debug|x86.Build.0 = Debug|x86 - {C6BD898B-B32A-417C-9529-B25877139EE1}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {C6BD898B-B32A-417C-9529-B25877139EE1}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {C6BD898B-B32A-417C-9529-B25877139EE1}.DebugRelease|x64.ActiveCfg = Release|x64 - {C6BD898B-B32A-417C-9529-B25877139EE1}.DebugRelease|x64.Build.0 = Release|x64 - {C6BD898B-B32A-417C-9529-B25877139EE1}.DebugRelease|x86.ActiveCfg = Release|x86 - {C6BD898B-B32A-417C-9529-B25877139EE1}.DebugRelease|x86.Build.0 = Release|x86 - {C6BD898B-B32A-417C-9529-B25877139EE1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C6BD898B-B32A-417C-9529-B25877139EE1}.Release|Any CPU.Build.0 = Release|Any CPU {C6BD898B-B32A-417C-9529-B25877139EE1}.Release|x64.ActiveCfg = Release|x64 {C6BD898B-B32A-417C-9529-B25877139EE1}.Release|x64.Build.0 = Release|x64 - {C6BD898B-B32A-417C-9529-B25877139EE1}.Release|x86.ActiveCfg = Release|x86 - {C6BD898B-B32A-417C-9529-B25877139EE1}.Release|x86.Build.0 = Release|x86 - {5CA53C31-44C8-47EE-B332-CC7F42E646A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5CA53C31-44C8-47EE-B332-CC7F42E646A9}.Debug|Any CPU.Build.0 = Debug|Any CPU {5CA53C31-44C8-47EE-B332-CC7F42E646A9}.Debug|x64.ActiveCfg = Debug|x64 {5CA53C31-44C8-47EE-B332-CC7F42E646A9}.Debug|x64.Build.0 = Debug|x64 - {5CA53C31-44C8-47EE-B332-CC7F42E646A9}.Debug|x86.ActiveCfg = Debug|x86 - {5CA53C31-44C8-47EE-B332-CC7F42E646A9}.Debug|x86.Build.0 = Debug|x86 - {5CA53C31-44C8-47EE-B332-CC7F42E646A9}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {5CA53C31-44C8-47EE-B332-CC7F42E646A9}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {5CA53C31-44C8-47EE-B332-CC7F42E646A9}.DebugRelease|x64.ActiveCfg = Release|x64 - {5CA53C31-44C8-47EE-B332-CC7F42E646A9}.DebugRelease|x64.Build.0 = Release|x64 - {5CA53C31-44C8-47EE-B332-CC7F42E646A9}.DebugRelease|x86.ActiveCfg = Release|x86 - {5CA53C31-44C8-47EE-B332-CC7F42E646A9}.DebugRelease|x86.Build.0 = Release|x86 - {5CA53C31-44C8-47EE-B332-CC7F42E646A9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5CA53C31-44C8-47EE-B332-CC7F42E646A9}.Release|Any CPU.Build.0 = Release|Any CPU {5CA53C31-44C8-47EE-B332-CC7F42E646A9}.Release|x64.ActiveCfg = Release|x64 {5CA53C31-44C8-47EE-B332-CC7F42E646A9}.Release|x64.Build.0 = Release|x64 - {5CA53C31-44C8-47EE-B332-CC7F42E646A9}.Release|x86.ActiveCfg = Release|x86 - {5CA53C31-44C8-47EE-B332-CC7F42E646A9}.Release|x86.Build.0 = Release|x86 - {E538FDBD-CCF1-4E20-A763-0C3CDA9D6335}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E538FDBD-CCF1-4E20-A763-0C3CDA9D6335}.Debug|Any CPU.Build.0 = Debug|Any CPU {E538FDBD-CCF1-4E20-A763-0C3CDA9D6335}.Debug|x64.ActiveCfg = Debug|x64 {E538FDBD-CCF1-4E20-A763-0C3CDA9D6335}.Debug|x64.Build.0 = Debug|x64 - {E538FDBD-CCF1-4E20-A763-0C3CDA9D6335}.Debug|x86.ActiveCfg = Debug|x86 - {E538FDBD-CCF1-4E20-A763-0C3CDA9D6335}.Debug|x86.Build.0 = Debug|x86 - {E538FDBD-CCF1-4E20-A763-0C3CDA9D6335}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {E538FDBD-CCF1-4E20-A763-0C3CDA9D6335}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {E538FDBD-CCF1-4E20-A763-0C3CDA9D6335}.DebugRelease|x64.ActiveCfg = Release|x64 - {E538FDBD-CCF1-4E20-A763-0C3CDA9D6335}.DebugRelease|x64.Build.0 = Release|x64 - {E538FDBD-CCF1-4E20-A763-0C3CDA9D6335}.DebugRelease|x86.ActiveCfg = Release|x86 - {E538FDBD-CCF1-4E20-A763-0C3CDA9D6335}.DebugRelease|x86.Build.0 = Release|x86 - {E538FDBD-CCF1-4E20-A763-0C3CDA9D6335}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E538FDBD-CCF1-4E20-A763-0C3CDA9D6335}.Release|Any CPU.Build.0 = Release|Any CPU {E538FDBD-CCF1-4E20-A763-0C3CDA9D6335}.Release|x64.ActiveCfg = Release|x64 {E538FDBD-CCF1-4E20-A763-0C3CDA9D6335}.Release|x64.Build.0 = Release|x64 - {E538FDBD-CCF1-4E20-A763-0C3CDA9D6335}.Release|x86.ActiveCfg = Release|x86 - {E538FDBD-CCF1-4E20-A763-0C3CDA9D6335}.Release|x86.Build.0 = Release|x86 - {01FA453A-86CA-4EC5-A0E9-266FEE14775C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {01FA453A-86CA-4EC5-A0E9-266FEE14775C}.Debug|Any CPU.Build.0 = Debug|Any CPU {01FA453A-86CA-4EC5-A0E9-266FEE14775C}.Debug|x64.ActiveCfg = Debug|x64 {01FA453A-86CA-4EC5-A0E9-266FEE14775C}.Debug|x64.Build.0 = Debug|x64 - {01FA453A-86CA-4EC5-A0E9-266FEE14775C}.Debug|x86.ActiveCfg = Debug|x86 - {01FA453A-86CA-4EC5-A0E9-266FEE14775C}.Debug|x86.Build.0 = Debug|x86 - {01FA453A-86CA-4EC5-A0E9-266FEE14775C}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {01FA453A-86CA-4EC5-A0E9-266FEE14775C}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {01FA453A-86CA-4EC5-A0E9-266FEE14775C}.DebugRelease|x64.ActiveCfg = Release|x64 - {01FA453A-86CA-4EC5-A0E9-266FEE14775C}.DebugRelease|x64.Build.0 = Release|x64 - {01FA453A-86CA-4EC5-A0E9-266FEE14775C}.DebugRelease|x86.ActiveCfg = Release|x86 - {01FA453A-86CA-4EC5-A0E9-266FEE14775C}.DebugRelease|x86.Build.0 = Release|x86 - {01FA453A-86CA-4EC5-A0E9-266FEE14775C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {01FA453A-86CA-4EC5-A0E9-266FEE14775C}.Release|Any CPU.Build.0 = Release|Any CPU {01FA453A-86CA-4EC5-A0E9-266FEE14775C}.Release|x64.ActiveCfg = Release|x64 {01FA453A-86CA-4EC5-A0E9-266FEE14775C}.Release|x64.Build.0 = Release|x64 - {01FA453A-86CA-4EC5-A0E9-266FEE14775C}.Release|x86.ActiveCfg = Release|x86 - {01FA453A-86CA-4EC5-A0E9-266FEE14775C}.Release|x86.Build.0 = Release|x86 - {33AD10FD-FB09-4603-9C79-8116B668F1E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {33AD10FD-FB09-4603-9C79-8116B668F1E9}.Debug|Any CPU.Build.0 = Debug|Any CPU {33AD10FD-FB09-4603-9C79-8116B668F1E9}.Debug|x64.ActiveCfg = Debug|x64 {33AD10FD-FB09-4603-9C79-8116B668F1E9}.Debug|x64.Build.0 = Debug|x64 - {33AD10FD-FB09-4603-9C79-8116B668F1E9}.Debug|x86.ActiveCfg = Debug|x86 - {33AD10FD-FB09-4603-9C79-8116B668F1E9}.Debug|x86.Build.0 = Debug|x86 - {33AD10FD-FB09-4603-9C79-8116B668F1E9}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {33AD10FD-FB09-4603-9C79-8116B668F1E9}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {33AD10FD-FB09-4603-9C79-8116B668F1E9}.DebugRelease|x64.ActiveCfg = Release|x64 - {33AD10FD-FB09-4603-9C79-8116B668F1E9}.DebugRelease|x64.Build.0 = Release|x64 - {33AD10FD-FB09-4603-9C79-8116B668F1E9}.DebugRelease|x86.ActiveCfg = Release|x86 - {33AD10FD-FB09-4603-9C79-8116B668F1E9}.DebugRelease|x86.Build.0 = Release|x86 - {33AD10FD-FB09-4603-9C79-8116B668F1E9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {33AD10FD-FB09-4603-9C79-8116B668F1E9}.Release|Any CPU.Build.0 = Release|Any CPU {33AD10FD-FB09-4603-9C79-8116B668F1E9}.Release|x64.ActiveCfg = Release|x64 {33AD10FD-FB09-4603-9C79-8116B668F1E9}.Release|x64.Build.0 = Release|x64 - {33AD10FD-FB09-4603-9C79-8116B668F1E9}.Release|x86.ActiveCfg = Release|x86 - {33AD10FD-FB09-4603-9C79-8116B668F1E9}.Release|x86.Build.0 = Release|x86 - {D88C0012-9188-452A-B93E-2AE040826A0E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D88C0012-9188-452A-B93E-2AE040826A0E}.Debug|Any CPU.Build.0 = Debug|Any CPU {D88C0012-9188-452A-B93E-2AE040826A0E}.Debug|x64.ActiveCfg = Debug|x64 {D88C0012-9188-452A-B93E-2AE040826A0E}.Debug|x64.Build.0 = Debug|x64 - {D88C0012-9188-452A-B93E-2AE040826A0E}.Debug|x86.ActiveCfg = Debug|x86 - {D88C0012-9188-452A-B93E-2AE040826A0E}.Debug|x86.Build.0 = Debug|x86 - {D88C0012-9188-452A-B93E-2AE040826A0E}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {D88C0012-9188-452A-B93E-2AE040826A0E}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {D88C0012-9188-452A-B93E-2AE040826A0E}.DebugRelease|x64.ActiveCfg = Release|x64 - {D88C0012-9188-452A-B93E-2AE040826A0E}.DebugRelease|x64.Build.0 = Release|x64 - {D88C0012-9188-452A-B93E-2AE040826A0E}.DebugRelease|x86.ActiveCfg = Release|x86 - {D88C0012-9188-452A-B93E-2AE040826A0E}.DebugRelease|x86.Build.0 = Release|x86 - {D88C0012-9188-452A-B93E-2AE040826A0E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D88C0012-9188-452A-B93E-2AE040826A0E}.Release|Any CPU.Build.0 = Release|Any CPU {D88C0012-9188-452A-B93E-2AE040826A0E}.Release|x64.ActiveCfg = Release|x64 {D88C0012-9188-452A-B93E-2AE040826A0E}.Release|x64.Build.0 = Release|x64 - {D88C0012-9188-452A-B93E-2AE040826A0E}.Release|x86.ActiveCfg = Release|x86 - {D88C0012-9188-452A-B93E-2AE040826A0E}.Release|x86.Build.0 = Release|x86 - {EE2DCA9B-E113-4E39-8833-338C37AE1188}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EE2DCA9B-E113-4E39-8833-338C37AE1188}.Debug|Any CPU.Build.0 = Debug|Any CPU {EE2DCA9B-E113-4E39-8833-338C37AE1188}.Debug|x64.ActiveCfg = Debug|x64 {EE2DCA9B-E113-4E39-8833-338C37AE1188}.Debug|x64.Build.0 = Debug|x64 - {EE2DCA9B-E113-4E39-8833-338C37AE1188}.Debug|x86.ActiveCfg = Debug|x86 - {EE2DCA9B-E113-4E39-8833-338C37AE1188}.Debug|x86.Build.0 = Debug|x86 - {EE2DCA9B-E113-4E39-8833-338C37AE1188}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {EE2DCA9B-E113-4E39-8833-338C37AE1188}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {EE2DCA9B-E113-4E39-8833-338C37AE1188}.DebugRelease|x64.ActiveCfg = Release|x64 - {EE2DCA9B-E113-4E39-8833-338C37AE1188}.DebugRelease|x64.Build.0 = Release|x64 - {EE2DCA9B-E113-4E39-8833-338C37AE1188}.DebugRelease|x86.ActiveCfg = Release|x86 - {EE2DCA9B-E113-4E39-8833-338C37AE1188}.DebugRelease|x86.Build.0 = Release|x86 - {EE2DCA9B-E113-4E39-8833-338C37AE1188}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EE2DCA9B-E113-4E39-8833-338C37AE1188}.Release|Any CPU.Build.0 = Release|Any CPU {EE2DCA9B-E113-4E39-8833-338C37AE1188}.Release|x64.ActiveCfg = Release|x64 {EE2DCA9B-E113-4E39-8833-338C37AE1188}.Release|x64.Build.0 = Release|x64 - {EE2DCA9B-E113-4E39-8833-338C37AE1188}.Release|x86.ActiveCfg = Release|x86 - {EE2DCA9B-E113-4E39-8833-338C37AE1188}.Release|x86.Build.0 = Release|x86 - {644C1578-87F0-420C-AE12-EEDD8F5EB9B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {644C1578-87F0-420C-AE12-EEDD8F5EB9B8}.Debug|Any CPU.Build.0 = Debug|Any CPU {644C1578-87F0-420C-AE12-EEDD8F5EB9B8}.Debug|x64.ActiveCfg = Debug|x64 {644C1578-87F0-420C-AE12-EEDD8F5EB9B8}.Debug|x64.Build.0 = Debug|x64 - {644C1578-87F0-420C-AE12-EEDD8F5EB9B8}.Debug|x86.ActiveCfg = Debug|x86 - {644C1578-87F0-420C-AE12-EEDD8F5EB9B8}.Debug|x86.Build.0 = Debug|x86 - {644C1578-87F0-420C-AE12-EEDD8F5EB9B8}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {644C1578-87F0-420C-AE12-EEDD8F5EB9B8}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {644C1578-87F0-420C-AE12-EEDD8F5EB9B8}.DebugRelease|x64.ActiveCfg = Release|x64 - {644C1578-87F0-420C-AE12-EEDD8F5EB9B8}.DebugRelease|x64.Build.0 = Release|x64 - {644C1578-87F0-420C-AE12-EEDD8F5EB9B8}.DebugRelease|x86.ActiveCfg = Release|x86 - {644C1578-87F0-420C-AE12-EEDD8F5EB9B8}.DebugRelease|x86.Build.0 = Release|x86 - {644C1578-87F0-420C-AE12-EEDD8F5EB9B8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {644C1578-87F0-420C-AE12-EEDD8F5EB9B8}.Release|Any CPU.Build.0 = Release|Any CPU {644C1578-87F0-420C-AE12-EEDD8F5EB9B8}.Release|x64.ActiveCfg = Release|x64 {644C1578-87F0-420C-AE12-EEDD8F5EB9B8}.Release|x64.Build.0 = Release|x64 - {644C1578-87F0-420C-AE12-EEDD8F5EB9B8}.Release|x86.ActiveCfg = Release|x86 - {644C1578-87F0-420C-AE12-EEDD8F5EB9B8}.Release|x86.Build.0 = Release|x86 - {C7E0AD59-48B2-4202-8965-467AF425D739}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C7E0AD59-48B2-4202-8965-467AF425D739}.Debug|Any CPU.Build.0 = Debug|Any CPU {C7E0AD59-48B2-4202-8965-467AF425D739}.Debug|x64.ActiveCfg = Debug|x64 {C7E0AD59-48B2-4202-8965-467AF425D739}.Debug|x64.Build.0 = Debug|x64 - {C7E0AD59-48B2-4202-8965-467AF425D739}.Debug|x86.ActiveCfg = Debug|x86 - {C7E0AD59-48B2-4202-8965-467AF425D739}.Debug|x86.Build.0 = Debug|x86 - {C7E0AD59-48B2-4202-8965-467AF425D739}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {C7E0AD59-48B2-4202-8965-467AF425D739}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {C7E0AD59-48B2-4202-8965-467AF425D739}.DebugRelease|x64.ActiveCfg = Release|x64 - {C7E0AD59-48B2-4202-8965-467AF425D739}.DebugRelease|x64.Build.0 = Release|x64 - {C7E0AD59-48B2-4202-8965-467AF425D739}.DebugRelease|x86.ActiveCfg = Release|x86 - {C7E0AD59-48B2-4202-8965-467AF425D739}.DebugRelease|x86.Build.0 = Release|x86 - {C7E0AD59-48B2-4202-8965-467AF425D739}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C7E0AD59-48B2-4202-8965-467AF425D739}.Release|Any CPU.Build.0 = Release|Any CPU {C7E0AD59-48B2-4202-8965-467AF425D739}.Release|x64.ActiveCfg = Release|x64 {C7E0AD59-48B2-4202-8965-467AF425D739}.Release|x64.Build.0 = Release|x64 - {C7E0AD59-48B2-4202-8965-467AF425D739}.Release|x86.ActiveCfg = Release|x86 - {C7E0AD59-48B2-4202-8965-467AF425D739}.Release|x86.Build.0 = Release|x86 - {1FC3CF78-663A-4489-8C2F-948BCB42E96D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1FC3CF78-663A-4489-8C2F-948BCB42E96D}.Debug|Any CPU.Build.0 = Debug|Any CPU {1FC3CF78-663A-4489-8C2F-948BCB42E96D}.Debug|x64.ActiveCfg = Debug|x64 {1FC3CF78-663A-4489-8C2F-948BCB42E96D}.Debug|x64.Build.0 = Debug|x64 - {1FC3CF78-663A-4489-8C2F-948BCB42E96D}.Debug|x86.ActiveCfg = Debug|x86 - {1FC3CF78-663A-4489-8C2F-948BCB42E96D}.Debug|x86.Build.0 = Debug|x86 - {1FC3CF78-663A-4489-8C2F-948BCB42E96D}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {1FC3CF78-663A-4489-8C2F-948BCB42E96D}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {1FC3CF78-663A-4489-8C2F-948BCB42E96D}.DebugRelease|x64.ActiveCfg = Release|x64 - {1FC3CF78-663A-4489-8C2F-948BCB42E96D}.DebugRelease|x64.Build.0 = Release|x64 - {1FC3CF78-663A-4489-8C2F-948BCB42E96D}.DebugRelease|x86.ActiveCfg = Release|x86 - {1FC3CF78-663A-4489-8C2F-948BCB42E96D}.DebugRelease|x86.Build.0 = Release|x86 - {1FC3CF78-663A-4489-8C2F-948BCB42E96D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1FC3CF78-663A-4489-8C2F-948BCB42E96D}.Release|Any CPU.Build.0 = Release|Any CPU {1FC3CF78-663A-4489-8C2F-948BCB42E96D}.Release|x64.ActiveCfg = Release|x64 {1FC3CF78-663A-4489-8C2F-948BCB42E96D}.Release|x64.Build.0 = Release|x64 - {1FC3CF78-663A-4489-8C2F-948BCB42E96D}.Release|x86.ActiveCfg = Release|x86 - {1FC3CF78-663A-4489-8C2F-948BCB42E96D}.Release|x86.Build.0 = Release|x86 - {0D5A5413-CDE7-4C61-A847-E99F949E5392}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0D5A5413-CDE7-4C61-A847-E99F949E5392}.Debug|Any CPU.Build.0 = Debug|Any CPU {0D5A5413-CDE7-4C61-A847-E99F949E5392}.Debug|x64.ActiveCfg = Debug|x64 {0D5A5413-CDE7-4C61-A847-E99F949E5392}.Debug|x64.Build.0 = Debug|x64 - {0D5A5413-CDE7-4C61-A847-E99F949E5392}.Debug|x86.ActiveCfg = Debug|x86 - {0D5A5413-CDE7-4C61-A847-E99F949E5392}.Debug|x86.Build.0 = Debug|x86 - {0D5A5413-CDE7-4C61-A847-E99F949E5392}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {0D5A5413-CDE7-4C61-A847-E99F949E5392}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {0D5A5413-CDE7-4C61-A847-E99F949E5392}.DebugRelease|x64.ActiveCfg = Release|x64 - {0D5A5413-CDE7-4C61-A847-E99F949E5392}.DebugRelease|x64.Build.0 = Release|x64 - {0D5A5413-CDE7-4C61-A847-E99F949E5392}.DebugRelease|x86.ActiveCfg = Release|x86 - {0D5A5413-CDE7-4C61-A847-E99F949E5392}.DebugRelease|x86.Build.0 = Release|x86 - {0D5A5413-CDE7-4C61-A847-E99F949E5392}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0D5A5413-CDE7-4C61-A847-E99F949E5392}.Release|Any CPU.Build.0 = Release|Any CPU {0D5A5413-CDE7-4C61-A847-E99F949E5392}.Release|x64.ActiveCfg = Release|x64 {0D5A5413-CDE7-4C61-A847-E99F949E5392}.Release|x64.Build.0 = Release|x64 - {0D5A5413-CDE7-4C61-A847-E99F949E5392}.Release|x86.ActiveCfg = Release|x86 - {0D5A5413-CDE7-4C61-A847-E99F949E5392}.Release|x86.Build.0 = Release|x86 - {DDFED30C-0590-418A-8139-D1835B56E12A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DDFED30C-0590-418A-8139-D1835B56E12A}.Debug|Any CPU.Build.0 = Debug|Any CPU {DDFED30C-0590-418A-8139-D1835B56E12A}.Debug|x64.ActiveCfg = Debug|x64 {DDFED30C-0590-418A-8139-D1835B56E12A}.Debug|x64.Build.0 = Debug|x64 - {DDFED30C-0590-418A-8139-D1835B56E12A}.Debug|x86.ActiveCfg = Debug|x86 - {DDFED30C-0590-418A-8139-D1835B56E12A}.Debug|x86.Build.0 = Debug|x86 - {DDFED30C-0590-418A-8139-D1835B56E12A}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {DDFED30C-0590-418A-8139-D1835B56E12A}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {DDFED30C-0590-418A-8139-D1835B56E12A}.DebugRelease|x64.ActiveCfg = Release|x64 - {DDFED30C-0590-418A-8139-D1835B56E12A}.DebugRelease|x64.Build.0 = Release|x64 - {DDFED30C-0590-418A-8139-D1835B56E12A}.DebugRelease|x86.ActiveCfg = Release|x86 - {DDFED30C-0590-418A-8139-D1835B56E12A}.DebugRelease|x86.Build.0 = Release|x86 - {DDFED30C-0590-418A-8139-D1835B56E12A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DDFED30C-0590-418A-8139-D1835B56E12A}.Release|Any CPU.Build.0 = Release|Any CPU {DDFED30C-0590-418A-8139-D1835B56E12A}.Release|x64.ActiveCfg = Release|x64 {DDFED30C-0590-418A-8139-D1835B56E12A}.Release|x64.Build.0 = Release|x64 - {DDFED30C-0590-418A-8139-D1835B56E12A}.Release|x86.ActiveCfg = Release|x86 - {DDFED30C-0590-418A-8139-D1835B56E12A}.Release|x86.Build.0 = Release|x86 - {5540E418-2C38-43CA-93BD-5BF2D48CA093}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5540E418-2C38-43CA-93BD-5BF2D48CA093}.Debug|Any CPU.Build.0 = Debug|Any CPU {5540E418-2C38-43CA-93BD-5BF2D48CA093}.Debug|x64.ActiveCfg = Debug|x64 {5540E418-2C38-43CA-93BD-5BF2D48CA093}.Debug|x64.Build.0 = Debug|x64 - {5540E418-2C38-43CA-93BD-5BF2D48CA093}.Debug|x86.ActiveCfg = Debug|x86 - {5540E418-2C38-43CA-93BD-5BF2D48CA093}.Debug|x86.Build.0 = Debug|x86 - {5540E418-2C38-43CA-93BD-5BF2D48CA093}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {5540E418-2C38-43CA-93BD-5BF2D48CA093}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {5540E418-2C38-43CA-93BD-5BF2D48CA093}.DebugRelease|x64.ActiveCfg = Release|x64 - {5540E418-2C38-43CA-93BD-5BF2D48CA093}.DebugRelease|x64.Build.0 = Release|x64 - {5540E418-2C38-43CA-93BD-5BF2D48CA093}.DebugRelease|x86.ActiveCfg = Release|x86 - {5540E418-2C38-43CA-93BD-5BF2D48CA093}.DebugRelease|x86.Build.0 = Release|x86 - {5540E418-2C38-43CA-93BD-5BF2D48CA093}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5540E418-2C38-43CA-93BD-5BF2D48CA093}.Release|Any CPU.Build.0 = Release|Any CPU {5540E418-2C38-43CA-93BD-5BF2D48CA093}.Release|x64.ActiveCfg = Release|x64 {5540E418-2C38-43CA-93BD-5BF2D48CA093}.Release|x64.Build.0 = Release|x64 - {5540E418-2C38-43CA-93BD-5BF2D48CA093}.Release|x86.ActiveCfg = Release|x86 - {5540E418-2C38-43CA-93BD-5BF2D48CA093}.Release|x86.Build.0 = Release|x86 - {8FCB1021-2434-4F1C-9E76-278DF4B54B4E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8FCB1021-2434-4F1C-9E76-278DF4B54B4E}.Debug|Any CPU.Build.0 = Debug|Any CPU {8FCB1021-2434-4F1C-9E76-278DF4B54B4E}.Debug|x64.ActiveCfg = Debug|x64 {8FCB1021-2434-4F1C-9E76-278DF4B54B4E}.Debug|x64.Build.0 = Debug|x64 - {8FCB1021-2434-4F1C-9E76-278DF4B54B4E}.Debug|x86.ActiveCfg = Debug|x86 - {8FCB1021-2434-4F1C-9E76-278DF4B54B4E}.Debug|x86.Build.0 = Debug|x86 - {8FCB1021-2434-4F1C-9E76-278DF4B54B4E}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {8FCB1021-2434-4F1C-9E76-278DF4B54B4E}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {8FCB1021-2434-4F1C-9E76-278DF4B54B4E}.DebugRelease|x64.ActiveCfg = Release|x64 - {8FCB1021-2434-4F1C-9E76-278DF4B54B4E}.DebugRelease|x64.Build.0 = Release|x64 - {8FCB1021-2434-4F1C-9E76-278DF4B54B4E}.DebugRelease|x86.ActiveCfg = Release|x86 - {8FCB1021-2434-4F1C-9E76-278DF4B54B4E}.DebugRelease|x86.Build.0 = Release|x86 - {8FCB1021-2434-4F1C-9E76-278DF4B54B4E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8FCB1021-2434-4F1C-9E76-278DF4B54B4E}.Release|Any CPU.Build.0 = Release|Any CPU {8FCB1021-2434-4F1C-9E76-278DF4B54B4E}.Release|x64.ActiveCfg = Release|x64 {8FCB1021-2434-4F1C-9E76-278DF4B54B4E}.Release|x64.Build.0 = Release|x64 - {8FCB1021-2434-4F1C-9E76-278DF4B54B4E}.Release|x86.ActiveCfg = Release|x86 - {8FCB1021-2434-4F1C-9E76-278DF4B54B4E}.Release|x86.Build.0 = Release|x86 - {F2C5AF38-EAD0-4154-9F17-320FAB77EAF0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F2C5AF38-EAD0-4154-9F17-320FAB77EAF0}.Debug|Any CPU.Build.0 = Debug|Any CPU {F2C5AF38-EAD0-4154-9F17-320FAB77EAF0}.Debug|x64.ActiveCfg = Debug|x64 {F2C5AF38-EAD0-4154-9F17-320FAB77EAF0}.Debug|x64.Build.0 = Debug|x64 - {F2C5AF38-EAD0-4154-9F17-320FAB77EAF0}.Debug|x86.ActiveCfg = Debug|x86 - {F2C5AF38-EAD0-4154-9F17-320FAB77EAF0}.Debug|x86.Build.0 = Debug|x86 - {F2C5AF38-EAD0-4154-9F17-320FAB77EAF0}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {F2C5AF38-EAD0-4154-9F17-320FAB77EAF0}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {F2C5AF38-EAD0-4154-9F17-320FAB77EAF0}.DebugRelease|x64.ActiveCfg = Release|x64 - {F2C5AF38-EAD0-4154-9F17-320FAB77EAF0}.DebugRelease|x64.Build.0 = Release|x64 - {F2C5AF38-EAD0-4154-9F17-320FAB77EAF0}.DebugRelease|x86.ActiveCfg = Release|x86 - {F2C5AF38-EAD0-4154-9F17-320FAB77EAF0}.DebugRelease|x86.Build.0 = Release|x86 - {F2C5AF38-EAD0-4154-9F17-320FAB77EAF0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F2C5AF38-EAD0-4154-9F17-320FAB77EAF0}.Release|Any CPU.Build.0 = Release|Any CPU {F2C5AF38-EAD0-4154-9F17-320FAB77EAF0}.Release|x64.ActiveCfg = Release|x64 {F2C5AF38-EAD0-4154-9F17-320FAB77EAF0}.Release|x64.Build.0 = Release|x64 - {F2C5AF38-EAD0-4154-9F17-320FAB77EAF0}.Release|x86.ActiveCfg = Release|x86 - {F2C5AF38-EAD0-4154-9F17-320FAB77EAF0}.Release|x86.Build.0 = Release|x86 - {13310458-D8FE-4F73-BA35-EF5627BBB66C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {13310458-D8FE-4F73-BA35-EF5627BBB66C}.Debug|Any CPU.Build.0 = Debug|Any CPU {13310458-D8FE-4F73-BA35-EF5627BBB66C}.Debug|x64.ActiveCfg = Debug|x64 {13310458-D8FE-4F73-BA35-EF5627BBB66C}.Debug|x64.Build.0 = Debug|x64 - {13310458-D8FE-4F73-BA35-EF5627BBB66C}.Debug|x86.ActiveCfg = Debug|x86 - {13310458-D8FE-4F73-BA35-EF5627BBB66C}.Debug|x86.Build.0 = Debug|x86 - {13310458-D8FE-4F73-BA35-EF5627BBB66C}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {13310458-D8FE-4F73-BA35-EF5627BBB66C}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {13310458-D8FE-4F73-BA35-EF5627BBB66C}.DebugRelease|x64.ActiveCfg = Release|x64 - {13310458-D8FE-4F73-BA35-EF5627BBB66C}.DebugRelease|x64.Build.0 = Release|x64 - {13310458-D8FE-4F73-BA35-EF5627BBB66C}.DebugRelease|x86.ActiveCfg = Release|x86 - {13310458-D8FE-4F73-BA35-EF5627BBB66C}.DebugRelease|x86.Build.0 = Release|x86 - {13310458-D8FE-4F73-BA35-EF5627BBB66C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {13310458-D8FE-4F73-BA35-EF5627BBB66C}.Release|Any CPU.Build.0 = Release|Any CPU {13310458-D8FE-4F73-BA35-EF5627BBB66C}.Release|x64.ActiveCfg = Release|x64 {13310458-D8FE-4F73-BA35-EF5627BBB66C}.Release|x64.Build.0 = Release|x64 - {13310458-D8FE-4F73-BA35-EF5627BBB66C}.Release|x86.ActiveCfg = Release|x86 - {13310458-D8FE-4F73-BA35-EF5627BBB66C}.Release|x86.Build.0 = Release|x86 - {9BAC842F-54A9-4104-859F-43C8AE7CC8F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9BAC842F-54A9-4104-859F-43C8AE7CC8F4}.Debug|Any CPU.Build.0 = Debug|Any CPU {9BAC842F-54A9-4104-859F-43C8AE7CC8F4}.Debug|x64.ActiveCfg = Debug|x64 {9BAC842F-54A9-4104-859F-43C8AE7CC8F4}.Debug|x64.Build.0 = Debug|x64 - {9BAC842F-54A9-4104-859F-43C8AE7CC8F4}.Debug|x86.ActiveCfg = Debug|x86 - {9BAC842F-54A9-4104-859F-43C8AE7CC8F4}.Debug|x86.Build.0 = Debug|x86 - {9BAC842F-54A9-4104-859F-43C8AE7CC8F4}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {9BAC842F-54A9-4104-859F-43C8AE7CC8F4}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {9BAC842F-54A9-4104-859F-43C8AE7CC8F4}.DebugRelease|x64.ActiveCfg = Release|x64 - {9BAC842F-54A9-4104-859F-43C8AE7CC8F4}.DebugRelease|x64.Build.0 = Release|x64 - {9BAC842F-54A9-4104-859F-43C8AE7CC8F4}.DebugRelease|x86.ActiveCfg = Release|x86 - {9BAC842F-54A9-4104-859F-43C8AE7CC8F4}.DebugRelease|x86.Build.0 = Release|x86 - {9BAC842F-54A9-4104-859F-43C8AE7CC8F4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9BAC842F-54A9-4104-859F-43C8AE7CC8F4}.Release|Any CPU.Build.0 = Release|Any CPU {9BAC842F-54A9-4104-859F-43C8AE7CC8F4}.Release|x64.ActiveCfg = Release|x64 {9BAC842F-54A9-4104-859F-43C8AE7CC8F4}.Release|x64.Build.0 = Release|x64 - {9BAC842F-54A9-4104-859F-43C8AE7CC8F4}.Release|x86.ActiveCfg = Release|x86 - {9BAC842F-54A9-4104-859F-43C8AE7CC8F4}.Release|x86.Build.0 = Release|x86 - {6CA136B2-9239-4A02-9007-B67D9940674D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6CA136B2-9239-4A02-9007-B67D9940674D}.Debug|Any CPU.Build.0 = Debug|Any CPU {6CA136B2-9239-4A02-9007-B67D9940674D}.Debug|x64.ActiveCfg = Debug|x64 {6CA136B2-9239-4A02-9007-B67D9940674D}.Debug|x64.Build.0 = Debug|x64 - {6CA136B2-9239-4A02-9007-B67D9940674D}.Debug|x86.ActiveCfg = Debug|Any CPU - {6CA136B2-9239-4A02-9007-B67D9940674D}.Debug|x86.Build.0 = Debug|Any CPU - {6CA136B2-9239-4A02-9007-B67D9940674D}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {6CA136B2-9239-4A02-9007-B67D9940674D}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {6CA136B2-9239-4A02-9007-B67D9940674D}.DebugRelease|x64.ActiveCfg = Release|Any CPU - {6CA136B2-9239-4A02-9007-B67D9940674D}.DebugRelease|x64.Build.0 = Release|Any CPU - {6CA136B2-9239-4A02-9007-B67D9940674D}.DebugRelease|x86.ActiveCfg = Release|Any CPU - {6CA136B2-9239-4A02-9007-B67D9940674D}.DebugRelease|x86.Build.0 = Release|Any CPU - {6CA136B2-9239-4A02-9007-B67D9940674D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6CA136B2-9239-4A02-9007-B67D9940674D}.Release|Any CPU.Build.0 = Release|Any CPU - {6CA136B2-9239-4A02-9007-B67D9940674D}.Release|x64.ActiveCfg = Release|Any CPU - {6CA136B2-9239-4A02-9007-B67D9940674D}.Release|x64.Build.0 = Release|Any CPU - {6CA136B2-9239-4A02-9007-B67D9940674D}.Release|x86.ActiveCfg = Release|Any CPU - {6CA136B2-9239-4A02-9007-B67D9940674D}.Release|x86.Build.0 = Release|Any CPU - {054D5606-83D2-430F-A910-A4D7079A881A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {054D5606-83D2-430F-A910-A4D7079A881A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6CA136B2-9239-4A02-9007-B67D9940674D}.Release|x64.ActiveCfg = Release|x64 + {6CA136B2-9239-4A02-9007-B67D9940674D}.Release|x64.Build.0 = Release|x64 {054D5606-83D2-430F-A910-A4D7079A881A}.Debug|x64.ActiveCfg = Debug|x64 {054D5606-83D2-430F-A910-A4D7079A881A}.Debug|x64.Build.0 = Debug|x64 - {054D5606-83D2-430F-A910-A4D7079A881A}.Debug|x86.ActiveCfg = Debug|Any CPU - {054D5606-83D2-430F-A910-A4D7079A881A}.Debug|x86.Build.0 = Debug|Any CPU - {054D5606-83D2-430F-A910-A4D7079A881A}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {054D5606-83D2-430F-A910-A4D7079A881A}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {054D5606-83D2-430F-A910-A4D7079A881A}.DebugRelease|x64.ActiveCfg = Release|Any CPU - {054D5606-83D2-430F-A910-A4D7079A881A}.DebugRelease|x64.Build.0 = Release|Any CPU - {054D5606-83D2-430F-A910-A4D7079A881A}.DebugRelease|x86.ActiveCfg = Release|Any CPU - {054D5606-83D2-430F-A910-A4D7079A881A}.DebugRelease|x86.Build.0 = Release|Any CPU - {054D5606-83D2-430F-A910-A4D7079A881A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {054D5606-83D2-430F-A910-A4D7079A881A}.Release|Any CPU.Build.0 = Release|Any CPU - {054D5606-83D2-430F-A910-A4D7079A881A}.Release|x64.ActiveCfg = Release|Any CPU - {054D5606-83D2-430F-A910-A4D7079A881A}.Release|x64.Build.0 = Release|Any CPU - {054D5606-83D2-430F-A910-A4D7079A881A}.Release|x86.ActiveCfg = Release|Any CPU - {054D5606-83D2-430F-A910-A4D7079A881A}.Release|x86.Build.0 = Release|Any CPU - {693446A7-8CCC-4C57-956C-3FB5613E72B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {693446A7-8CCC-4C57-956C-3FB5613E72B7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {054D5606-83D2-430F-A910-A4D7079A881A}.Release|x64.ActiveCfg = Release|x64 + {054D5606-83D2-430F-A910-A4D7079A881A}.Release|x64.Build.0 = Release|x64 {693446A7-8CCC-4C57-956C-3FB5613E72B7}.Debug|x64.ActiveCfg = Debug|x64 {693446A7-8CCC-4C57-956C-3FB5613E72B7}.Debug|x64.Build.0 = Debug|x64 - {693446A7-8CCC-4C57-956C-3FB5613E72B7}.Debug|x86.ActiveCfg = Debug|Any CPU - {693446A7-8CCC-4C57-956C-3FB5613E72B7}.Debug|x86.Build.0 = Debug|Any CPU - {693446A7-8CCC-4C57-956C-3FB5613E72B7}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {693446A7-8CCC-4C57-956C-3FB5613E72B7}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {693446A7-8CCC-4C57-956C-3FB5613E72B7}.DebugRelease|x64.ActiveCfg = Release|Any CPU - {693446A7-8CCC-4C57-956C-3FB5613E72B7}.DebugRelease|x64.Build.0 = Release|Any CPU - {693446A7-8CCC-4C57-956C-3FB5613E72B7}.DebugRelease|x86.ActiveCfg = Release|Any CPU - {693446A7-8CCC-4C57-956C-3FB5613E72B7}.DebugRelease|x86.Build.0 = Release|Any CPU - {693446A7-8CCC-4C57-956C-3FB5613E72B7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {693446A7-8CCC-4C57-956C-3FB5613E72B7}.Release|Any CPU.Build.0 = Release|Any CPU - {693446A7-8CCC-4C57-956C-3FB5613E72B7}.Release|x64.ActiveCfg = Release|Any CPU - {693446A7-8CCC-4C57-956C-3FB5613E72B7}.Release|x64.Build.0 = Release|Any CPU - {693446A7-8CCC-4C57-956C-3FB5613E72B7}.Release|x86.ActiveCfg = Release|Any CPU - {693446A7-8CCC-4C57-956C-3FB5613E72B7}.Release|x86.Build.0 = Release|Any CPU - {94719656-30B8-4C25-98D0-5DB42D968FAB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {94719656-30B8-4C25-98D0-5DB42D968FAB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {693446A7-8CCC-4C57-956C-3FB5613E72B7}.Release|x64.ActiveCfg = Release|x64 + {693446A7-8CCC-4C57-956C-3FB5613E72B7}.Release|x64.Build.0 = Release|x64 {94719656-30B8-4C25-98D0-5DB42D968FAB}.Debug|x64.ActiveCfg = Debug|x64 {94719656-30B8-4C25-98D0-5DB42D968FAB}.Debug|x64.Build.0 = Debug|x64 - {94719656-30B8-4C25-98D0-5DB42D968FAB}.Debug|x86.ActiveCfg = Debug|Any CPU - {94719656-30B8-4C25-98D0-5DB42D968FAB}.Debug|x86.Build.0 = Debug|Any CPU - {94719656-30B8-4C25-98D0-5DB42D968FAB}.DebugRelease|Any CPU.ActiveCfg = Release|Any CPU - {94719656-30B8-4C25-98D0-5DB42D968FAB}.DebugRelease|Any CPU.Build.0 = Release|Any CPU - {94719656-30B8-4C25-98D0-5DB42D968FAB}.DebugRelease|x64.ActiveCfg = Release|Any CPU - {94719656-30B8-4C25-98D0-5DB42D968FAB}.DebugRelease|x64.Build.0 = Release|Any CPU - {94719656-30B8-4C25-98D0-5DB42D968FAB}.DebugRelease|x86.ActiveCfg = Release|Any CPU - {94719656-30B8-4C25-98D0-5DB42D968FAB}.DebugRelease|x86.Build.0 = Release|Any CPU - {94719656-30B8-4C25-98D0-5DB42D968FAB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {94719656-30B8-4C25-98D0-5DB42D968FAB}.Release|Any CPU.Build.0 = Release|Any CPU - {94719656-30B8-4C25-98D0-5DB42D968FAB}.Release|x64.ActiveCfg = Release|Any CPU - {94719656-30B8-4C25-98D0-5DB42D968FAB}.Release|x64.Build.0 = Release|Any CPU - {94719656-30B8-4C25-98D0-5DB42D968FAB}.Release|x86.ActiveCfg = Release|Any CPU - {94719656-30B8-4C25-98D0-5DB42D968FAB}.Release|x86.Build.0 = Release|Any CPU + {94719656-30B8-4C25-98D0-5DB42D968FAB}.Release|x64.ActiveCfg = Release|x64 + {94719656-30B8-4C25-98D0-5DB42D968FAB}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From 1e04450e7f25c9ceca6e2b2f3ba4ecf8e501f072 Mon Sep 17 00:00:00 2001 From: Mathieu GRENET Date: Thu, 3 Apr 2025 17:28:31 +0200 Subject: [PATCH 05/33] Argyll measure brightness --- HLab.Core | 2 +- HLab.Sys/HLab.Sys.Argyll/ArgyllProbe.cs | 984 +++++++-------- .../DrawingContextExtention.cs | 30 +- .../TestPattern.cs | 43 +- .../MonitorRgbLevel.cs | 68 +- .../HLab.Sys.Windows.MonitorVcp/ProbeLut.cs | 516 +++++--- HLab.Sys/HLab.Sys.Windows.MonitorVcp/Tune.cs | 5 +- .../17.14.260.54502/CodeChunks.db | Bin 0 -> 69632 bytes .../17.14.260.54502/SemanticSymbols.db | Bin 0 -> 49152 bytes .../.vs/LittleBigMouse.Hook.Rust/v17/.wsuo | Bin 0 -> 193024 bytes .../v17/DocumentLayout.json | 73 ++ .../.vs/ProjectSettings.json | 3 + .../.vs/VSWorkspaceState.json | 6 + LittleBigMouse.Hook.Rust/.vs/slnx.sqlite | Bin 0 -> 90112 bytes .../LittleBigMouse.Plugin.Vcp.Avalonia.csproj | 2 +- .../VcpScreenView.axaml | 29 +- .../VcpScreenView.axaml.cs | 6 - .../VcpScreenViewModel.cs | 1097 ++++++++++------- .../LittleBigMouse.Server.csproj | 2 +- 19 files changed, 1615 insertions(+), 1251 deletions(-) create mode 100644 LittleBigMouse.Hook.Rust/.vs/LittleBigMouse.Hook.Rust/CopilotIndices/17.14.260.54502/CodeChunks.db create mode 100644 LittleBigMouse.Hook.Rust/.vs/LittleBigMouse.Hook.Rust/CopilotIndices/17.14.260.54502/SemanticSymbols.db create mode 100644 LittleBigMouse.Hook.Rust/.vs/LittleBigMouse.Hook.Rust/v17/.wsuo create mode 100644 LittleBigMouse.Hook.Rust/.vs/LittleBigMouse.Hook.Rust/v17/DocumentLayout.json create mode 100644 LittleBigMouse.Hook.Rust/.vs/ProjectSettings.json create mode 100644 LittleBigMouse.Hook.Rust/.vs/VSWorkspaceState.json create mode 100644 LittleBigMouse.Hook.Rust/.vs/slnx.sqlite diff --git a/HLab.Core b/HLab.Core index b1b73572..75375c50 160000 --- a/HLab.Core +++ b/HLab.Core @@ -1 +1 @@ -Subproject commit b1b73572689087e2bcfef6d0080ca0e3b2914fa7 +Subproject commit 75375c501836119027863d5aca43d345a94c86dc diff --git a/HLab.Sys/HLab.Sys.Argyll/ArgyllProbe.cs b/HLab.Sys/HLab.Sys.Argyll/ArgyllProbe.cs index 5339078f..220a0d58 100644 --- a/HLab.Sys/HLab.Sys.Argyll/ArgyllProbe.cs +++ b/HLab.Sys/HLab.Sys.Argyll/ArgyllProbe.cs @@ -31,417 +31,419 @@ namespace HLab.Sys.Argyll; public class ArgyllProbe : ReactiveObject { - public ArgyllProbe() - { - ConfigFromDipcalGUI(); - } - public ArgyllProbe(bool autoconfig = true) - { - if(autoconfig) ConfigFromDipcalGUI(); - } - - - private static IniFile _dispcalIni; - private static IniFile DispcalIni - { - get - { - if (_dispcalIni == null) - _dispcalIni = new IniFile( - Path.Combine( - Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), - @"DisplayCAL\DisplayCAL.ini" - )); - - return _dispcalIni; - } - - } - - - private readonly double[] _xyz = { 0, 0, 0 }; - // private readonly double[] _lab = { 0, 0, 0 }; - - private static void ArgyllSendKey(Process p, String key) - { - //System.Threading.Thread.Sleep(300); - p.StandardInput.Flush(); - p.StandardInput.Write(key); - p.StandardInput.Flush(); - } - - private bool _calibrating = false; - private bool _spectrum = false; - - public string Name - { - get => _name; - set => this.RaiseAndSetIfChanged(ref _name, value); - } - string _name; - - public double SpectrumFrom - { - get => _spectrumFrom; - set => this.RaiseAndSetIfChanged(ref _spectrumFrom, value); - } - double _spectrumFrom; - - public double SpectrumTo - { - get => _spectrumTo; - set => this.RaiseAndSetIfChanged(ref _spectrumTo, value); - } - double _spectrumTo;//c => c.Default(720.0)); - - public int SpectrumSteps - { - get => _spectrumSteps; - set => this.RaiseAndSetIfChanged(ref _spectrumSteps, value); - } - int _spectrumSteps; - - public double Cct - { - get => _cct; - set => this.RaiseAndSetIfChanged(ref _cct, value); - } - double _cct; - - public double Cri - { - get => _cri; - set => this.RaiseAndSetIfChanged(ref _cri, value); - } - double _cri; - - public double Tlci - { - get => _tlci; - set => this.RaiseAndSetIfChanged(ref _tlci, value); - } - double _tlci; - - public double Lux - { - get => _lux; - set => this.RaiseAndSetIfChanged(ref _lux, value); - } - double _lux; - - public ObservableCollection Spectrum { get; set; } = new ObservableCollection {0}; - - public ObservableCollection WaveLength { get; set; } = new ObservableCollection {0}; - private void ArgyllOutputHandler(object sendingProcess, DataReceivedEventArgs outLine) - { - System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); - - var line = outLine.Data; - - Console.WriteLine(line); - - if (line == null) return; - - if (sendingProcess is not Process p) return; - - if (_spectrum) - { - var s = line.Split(','); - - Spectrum.Clear(); - WaveLength.Clear(); - - var nm = SpectrumFrom; - var step = (SpectrumTo - SpectrumFrom)/(SpectrumSteps - 1); - - foreach (var t in s) - { - Spectrum.Add( double.Parse(t)); - WaveLength.Add(nm); - nm += step; - } - _spectrum = false; - } - - - if (line.Contains("Spectrum from")) - { - var pos = line.IndexOf("Spectrum from", StringComparison.Ordinal); - var sub = line[(pos + 14)..]; - var s = sub.Split(' '); - SpectrumFrom = double.Parse(s[0]); - SpectrumTo = double.Parse(s[2]); - SpectrumSteps = int.Parse(s[5]); - _spectrum = true; - } - - if (line.Contains("Ambient")) - { - string[] s = line.Split(' '); - Lux = double.Parse(s[3]); - Cct = double.Parse(s[7].Replace("K","")); - } - - if (line.Contains("(Ra)")) - { - string[] s = line.Split(' '); - Cri = double.Parse(s[6]); - } - - if (line.Contains("(Qa)")) - { - string[] s = line.Split(' '); - Tlci = double.Parse(s[8]); - } - - if (line.Contains("Error - Opening USB port")) - ArgyllSendKey(p, "q"); - - if (line.Contains("calibration position")) - { - if (!_calibrating) - { - // TODO - //var result = MessageBox.Show("Place instrument in calibration position", "Instrument", - // MessageBoxButton.OKCancel, MessageBoxImage.Information); - //ArgyllSendKey(p, result == MessageBoxResult.OK ? "k" : "q"); - - _calibrating = true; - } - else ArgyllSendKey(p, "k"); - } - - if (line.Contains("Place instrument")) - { - System.Threading.Thread.Sleep(300); - p.StandardInput.Flush(); - //var result = MessageBox.Show("Place instrument in measure position", "Instrument", + public ArgyllProbe() + { + ConfigFromDipcalGUI(); + } + public ArgyllProbe(bool autoconfig = true) + { + if (autoconfig) ConfigFromDipcalGUI(); + } + + + private static IniFile _dispcalIni; + private static IniFile DispcalIni + { + get + { + if (_dispcalIni == null) + _dispcalIni = new IniFile( + Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + @"DisplayCAL\DisplayCAL.ini" + )); + + return _dispcalIni; + } + + } + + + private readonly double[] _xyz = { 0, 0, 0 }; + // private readonly double[] _lab = { 0, 0, 0 }; + + private static void ArgyllSendKey(Process p, String key) + { + //System.Threading.Thread.Sleep(300); + p.StandardInput.Flush(); + p.StandardInput.Write(key); + p.StandardInput.Flush(); + } + + private bool _calibrating = false; + private bool _spectrum = false; + + public string Name + { + get => _name; + set => this.RaiseAndSetIfChanged(ref _name, value); + } + string _name; + + public double SpectrumFrom + { + get => _spectrumFrom; + set => this.RaiseAndSetIfChanged(ref _spectrumFrom, value); + } + double _spectrumFrom; + + public double SpectrumTo + { + get => _spectrumTo; + set => this.RaiseAndSetIfChanged(ref _spectrumTo, value); + } + double _spectrumTo;//c => c.Default(720.0)); + + public int SpectrumSteps + { + get => _spectrumSteps; + set => this.RaiseAndSetIfChanged(ref _spectrumSteps, value); + } + int _spectrumSteps; + + public double Cct + { + get => _cct; + set => this.RaiseAndSetIfChanged(ref _cct, value); + } + double _cct; + + public double Cri + { + get => _cri; + set => this.RaiseAndSetIfChanged(ref _cri, value); + } + double _cri; + + public double Tlci + { + get => _tlci; + set => this.RaiseAndSetIfChanged(ref _tlci, value); + } + double _tlci; + + public double Lux + { + get => _lux; + set => this.RaiseAndSetIfChanged(ref _lux, value); + } + double _lux; + + public string Message + { + get => _message; + set => this.RaiseAndSetIfChanged(ref _message, value); + } + string _message; + + public ObservableCollection Spectrum { get; set; } = new ObservableCollection { 0 }; + + public ObservableCollection WaveLength { get; set; } = new ObservableCollection { 0 }; + private void ArgyllOutputHandler(object sendingProcess, DataReceivedEventArgs outLine) + { + System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); + + var line = outLine.Data; + + Console.WriteLine(line); + + if (line == null) return; + + if (sendingProcess is not Process p) return; + + if (_spectrum) + { + var s = line.Split(','); + + Spectrum.Clear(); + WaveLength.Clear(); + + var nm = SpectrumFrom; + var step = (SpectrumTo - SpectrumFrom) / (SpectrumSteps - 1); + + foreach (var t in s) + { + Spectrum.Add(double.Parse(t)); + WaveLength.Add(nm); + nm += step; + } + _spectrum = false; + } + + + if (line.Contains("Spectrum from")) + { + var pos = line.IndexOf("Spectrum from", StringComparison.Ordinal); + var sub = line[(pos + 14)..]; + var s = sub.Split(' '); + SpectrumFrom = double.Parse(s[0]); + SpectrumTo = double.Parse(s[2]); + SpectrumSteps = int.Parse(s[5]); + _spectrum = true; + } + + if (line.Contains("Ambient")) + { + string[] s = line.Split(' '); + Lux = double.Parse(s[3]); + Cct = double.Parse(s[7].Replace("K", "")); + } + + if (line.Contains("(Ra)")) + { + string[] s = line.Split(' '); + Cri = double.Parse(s[6]); + } + + if (line.Contains("(Qa)")) + { + string[] s = line.Split(' '); + Tlci = double.Parse(s[8]); + } + + if (line.Contains("Error - Opening USB port")) + ArgyllSendKey(p, "q"); + + if (line.Contains("calibration position")) + { + if (!_calibrating) + { + // TODO + //var result = MessageBox.Show("Place instrument in calibration position", "Instrument", // MessageBoxButton.OKCancel, MessageBoxImage.Information); - //ArgyllSendKey(p, result == MessageBoxResult.OK ? "0" : "q"); - ArgyllSendKey(p, "0"); - } - - if (line.Contains("Result is XYZ:")) - { - int pos = line.IndexOf("XYZ: ", StringComparison.Ordinal); - string sub = line.Substring(pos + 5); - sub = sub.Remove(sub.IndexOf(',')); - string[] s = sub.Split(' '); - for (int i = 0; i < 3; i++) - { - try - { - _xyz[i] = Double.Parse(s[i]); - } - catch { _xyz[i] = 0; } - } - - _calibrating = false; - //if (line.Contains("D50 Lab:")) - //{ - // pos = line.IndexOf("D50 Lab:", StringComparison.Ordinal); - // sub = line.Substring(pos + 9); - // //sub.Remove(sub.IndexOf(',')); - // s = sub.Split(' '); - // for (int i = 0; i < 3; i++) - // { - // try - // { - // _lab[i] = Double.Parse(s[i]); - // } - // catch { _lab[i] = 0; } - // } - - //} - - //((Process)sendingProcess).Kill(); - } - } - - public enum MeasurementMode - { - Emissive, - Projector, - Ambiant, - Flash - } - - public enum ObserverEnum - { - CIE_1931_2, - CIE_1964_10, - CIE_2012_10, - CIE_2012_2, - SB_1955_2, - JV_1978_2, - Shaw, - } - - public static string ArgyllPath { get; set; } - - public int ColorTemp { get; set; } = 6500; - public MeasurementMode Mode { get; set; } = MeasurementMode.Emissive; - public bool HighResolution { get; set; } = true; - public bool Adaptive { get; set; } = true; - public bool ReadSpectrum { get; set; } = false; - public bool ReadCri { get; set; } = false; - - private ObserverEnum Observer { get; set; } = ObserverEnum.CIE_1931_2; - - public static void PathFromDispcalGUI() - { - ArgyllPath = DispcalIni.ReadValue("Default", "argyll.dir", ""); - } - - public void ConfigFromDipcalGUI() - { - PathFromDispcalGUI(); - - ColorTemp = - int.Parse(DispcalIni.ReadValue("Default", "whitepoint.colortemp", "5000")); - - switch (DispcalIni.ReadValue("Default", "measurement_mode", "1")) - { - case "c": // CRT ??? - break; - case "p": // CRT ??? - Mode = MeasurementMode.Projector; - break; - case "1": - Mode = MeasurementMode.Emissive; - break; - } - - HighResolution = (DispcalIni.ReadValue("Default", "measurement_mode.highres", "0") == "1"); - - Adaptive = (DispcalIni.ReadValue("Default", "measurement_mode.adaptive", "1") == "1"); - - string obs = DispcalIni.ReadValue("Default", "observer", "1931_2"); - switch (obs) - { - case "1931_2": - Observer = ObserverEnum.CIE_1931_2; - break; - case "1964_10": - Observer = ObserverEnum.CIE_1964_10; - break; - case "1955_2": - Observer = ObserverEnum.SB_1955_2; - break; - case "shaw": - Observer = ObserverEnum.Shaw; - break; - case "1978_2": - Observer = ObserverEnum.JV_1978_2; - break; - case "2012_2": - Observer = ObserverEnum.CIE_2012_2; - break; - case "2012_10": - Observer = ObserverEnum.CIE_2012_10; - break; - } - } - - public string SpotReadArgs - { - get - { - string s = " -N"; - switch (Mode) - { - case MeasurementMode.Projector: - s += " -pb"; - break; - case MeasurementMode.Emissive: - s += " -e"; - break; - case MeasurementMode.Ambiant: - s += " -a"; - break; - case MeasurementMode.Flash: - s += " -f"; - break; - } - - - - if (HighResolution) s += " -H"; - - if (!Adaptive) s += " -Y A"; - - s += " -O"; - - s += " -Q"; - - switch (Observer) - { - case ObserverEnum.CIE_1931_2: - s += " 1931_2"; - break; - case ObserverEnum.CIE_1964_10: - s += " 1964_10"; - break; - case ObserverEnum.SB_1955_2: - s += " 1955_2"; - break; - case ObserverEnum.Shaw: - s += " shaw"; - break; - case ObserverEnum.JV_1978_2: - s += " 1978_2"; - break; - default: - throw new ArgumentOutOfRangeException(); - } - - if (ReadSpectrum) s += " -s"; - if (ReadCri) s += " -T"; - return s; - } - } - - - public bool Installed => ArgyllPath != ""; - - public bool SpotRead() - { - if (!Installed) return false; - - do - { - ExecSpotRead(); - } while (_calibrating); - - return true; - } - - public ProbedColor ProbedColor => new ProbedColorXYZ - { - Illuminant = ProbedColor.DIlluminant(ColorTemp), - X = _xyz[0], - Y = _xyz[1], - Z = _xyz[2] - }; - - public void ExecSpotRead() - { - var aProc = Process.GetProcessesByName("Spotread"); - foreach (var t in aProc) - { + //ArgyllSendKey(p, result == MessageBoxResult.OK ? "k" : "q"); + + Message = "Place instrument in calibration position"; + + _calibrating = true; + } + else ArgyllSendKey(p, "k"); + } + + if (line.Contains("Place instrument")) + { + System.Threading.Thread.Sleep(300); + p.StandardInput.Flush(); + + Message = "Place instrument in measure position"; + //var result = MessageBox.Show("Place instrument in measure position", "Instrument", + // MessageBoxButton.OKCancel, MessageBoxImage.Information); + //ArgyllSendKey(p, result == MessageBoxResult.OK ? "0" : "q"); + ArgyllSendKey(p, "0"); + } + + if (line.Contains("Result is XYZ:")) + { + int pos = line.IndexOf("XYZ: ", StringComparison.Ordinal); + string sub = line.Substring(pos + 5); + sub = sub.Remove(sub.IndexOf(',')); + string[] s = sub.Split(' '); + for (int i = 0; i < 3; i++) + { try { - t.Kill(); - if (!t.HasExited) - t.WaitForExit(); - + _xyz[i] = Double.Parse(s[i]); } - catch (Exception) { } - } - - var p = new Process - { - StartInfo = + catch { _xyz[i] = 0; } + } + + _calibrating = false; + //if (line.Contains("D50 Lab:")) + //{ + // pos = line.IndexOf("D50 Lab:", StringComparison.Ordinal); + // sub = line.Substring(pos + 9); + // //sub.Remove(sub.IndexOf(',')); + // s = sub.Split(' '); + // for (int i = 0; i < 3; i++) + // { + // try + // { + // _lab[i] = Double.Parse(s[i]); + // } + // catch { _lab[i] = 0; } + // } + + //} + + //((Process)sendingProcess).Kill(); + } + } + + public enum MeasurementMode + { + Emissive, + Projector, + Ambiant, + Flash + } + + public enum ObserverEnum + { + CIE_1931_2, + CIE_1964_10, + CIE_2012_10, + CIE_2012_2, + SB_1955_2, + JV_1978_2, + Shaw, + } + + public static string ArgyllPath { get; set; } + + public int ColorTemp { get; set; } = 6500; + public MeasurementMode Mode { get; set; } = MeasurementMode.Emissive; + public bool HighResolution { get; set; } = true; + public bool Adaptive { get; set; } = true; + public bool ReadSpectrum { get; set; } = false; + public bool ReadCri { get; set; } = false; + + private ObserverEnum Observer { get; set; } = ObserverEnum.CIE_1931_2; + + public static void PathFromDispcalGUI() + { + ArgyllPath = DispcalIni.ReadValue("Default", "argyll.dir", ""); + } + + public void ConfigFromDipcalGUI() + { + PathFromDispcalGUI(); + + ColorTemp = + int.Parse(DispcalIni.ReadValue("Default", "whitepoint.colortemp", "5000")); + + switch (DispcalIni.ReadValue("Default", "measurement_mode", "1")) + { + case "c": // CRT ??? + break; + case "p": // CRT ??? + Mode = MeasurementMode.Projector; + break; + case "1": + Mode = MeasurementMode.Emissive; + break; + } + + HighResolution = (DispcalIni.ReadValue("Default", "measurement_mode.highres", "0") == "1"); + + Adaptive = (DispcalIni.ReadValue("Default", "measurement_mode.adaptive", "1") == "1"); + + string obs = DispcalIni.ReadValue("Default", "observer", "1931_2"); + switch (obs) + { + case "1931_2": + Observer = ObserverEnum.CIE_1931_2; + break; + case "1964_10": + Observer = ObserverEnum.CIE_1964_10; + break; + case "1955_2": + Observer = ObserverEnum.SB_1955_2; + break; + case "shaw": + Observer = ObserverEnum.Shaw; + break; + case "1978_2": + Observer = ObserverEnum.JV_1978_2; + break; + case "2012_2": + Observer = ObserverEnum.CIE_2012_2; + break; + case "2012_10": + Observer = ObserverEnum.CIE_2012_10; + break; + } + } + + public string SpotReadArgs + { + get + { + string s = " -N"; + switch (Mode) + { + case MeasurementMode.Projector: + s += " -pb"; + break; + case MeasurementMode.Emissive: + s += " -e"; + break; + case MeasurementMode.Ambiant: + s += " -a"; + break; + case MeasurementMode.Flash: + s += " -f"; + break; + } + + + + if (HighResolution) s += " -H"; + + if (!Adaptive) s += " -Y A"; + + s += " -O"; + + s += " -Q"; + + s += Observer switch + { + ObserverEnum.CIE_1931_2 => " 1931_2", + ObserverEnum.CIE_1964_10 => " 1964_10", + ObserverEnum.SB_1955_2 => " 1955_2", + ObserverEnum.Shaw => " shaw", + ObserverEnum.JV_1978_2 => " 1978_2", + ObserverEnum.CIE_2012_2 => " 2012_2", + ObserverEnum.CIE_2012_10 => " 2012_10", + _ => throw new ArgumentOutOfRangeException() + }; + + if (ReadSpectrum) s += " -s"; + if (ReadCri) s += " -T"; + return s; + } + } + + + public bool Installed => ArgyllPath != ""; + + public bool SpotRead() + { + if (!Installed) return false; + + do + { + ExecSpotRead(); + } while (_calibrating); + + return true; + } + + public ProbedColor ProbedColor => new ProbedColorXYZ + { + Illuminant = ProbedColor.DIlluminant(ColorTemp), + X = _xyz[0], + Y = _xyz[1], + Z = _xyz[2] + }; + + public void ExecSpotRead() + { + var aProc = Process.GetProcessesByName("Spotread"); + foreach (var t in aProc) + { + try + { + t.Kill(); + if (!t.HasExited) + t.WaitForExit(); + + } + catch (Exception) { } + } + + var p = new Process + { + StartInfo = { FileName = Path.Combine(ArgyllPath, @"Spotread.exe"), Arguments = SpotReadArgs, @@ -451,90 +453,90 @@ public void ExecSpotRead() RedirectStandardInput = true, CreateNoWindow = true } - }; - - // p.StartInfo.Arguments = "-N -O -Y A"; - - try - { - p.StartInfo.EnvironmentVariables.Add("ARGYLL_NOT_INTERACTIVE", "yes"); - } - catch - { - } - - p.ErrorDataReceived += ArgyllOutputHandler; - p.OutputDataReceived += ArgyllOutputHandler; - - p.Start(); - p.BeginErrorReadLine(); - p.BeginOutputReadLine(); - - if (!p.HasExited) p.WaitForExit(); - } - - //TODO - - public void Save() - { - // Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog(); - // dlg.DefaultExt = ".probe"; - // dlg.Filter = "Probe documents (.probe)|*.probe"; - // bool? result = dlg.ShowDialog(); - // if (result == true) - // { - // // Open document - // string filename = dlg.FileName; - // Save(filename); - // } - } - - public void Save(string path) - { - XmlSerializer serializer = new XmlSerializer(typeof(ArgyllProbe)); - using (TextWriter writer = new StreamWriter(path)) - { - serializer.Serialize(writer, this); - } - } - - - public static ArgyllProbe Load() - { - //TODO - //Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog(); - //dlg.DefaultExt = ".probe"; - //dlg.Filter = "Probe documents (.probe)|*.probe"; - //bool? result = dlg.ShowDialog(); - //if (result == true) - //{ - // // Open document - // string filename = dlg.FileName; - // return Load(filename); - //} - return null; - } - - - public static ArgyllProbe Load(string path) - { - ArgyllProbe probe = null; - - XmlSerializer deserializer = new XmlSerializer(typeof(ArgyllProbe)); - - try - { - TextReader reader = new StreamReader(path); - probe = (ArgyllProbe)deserializer.Deserialize(reader); - reader.Close(); - } - catch (FileNotFoundException) - { - - } - - return probe; - } + }; + + // p.StartInfo.Arguments = "-N -O -Y A"; + + try + { + p.StartInfo.EnvironmentVariables.Add("ARGYLL_NOT_INTERACTIVE", "yes"); + } + catch + { + } + + p.ErrorDataReceived += ArgyllOutputHandler; + p.OutputDataReceived += ArgyllOutputHandler; + + p.Start(); + p.BeginErrorReadLine(); + p.BeginOutputReadLine(); + + if (!p.HasExited) p.WaitForExit(); + } + + //TODO + + public void Save() + { + // Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog(); + // dlg.DefaultExt = ".probe"; + // dlg.Filter = "Probe documents (.probe)|*.probe"; + // bool? result = dlg.ShowDialog(); + // if (result == true) + // { + // // Open document + // string filename = dlg.FileName; + // Save(filename); + // } + } + + public void Save(string path) + { + XmlSerializer serializer = new XmlSerializer(typeof(ArgyllProbe)); + using (TextWriter writer = new StreamWriter(path)) + { + serializer.Serialize(writer, this); + } + } + + + public static ArgyllProbe Load() + { + //TODO + //Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog(); + //dlg.DefaultExt = ".probe"; + //dlg.Filter = "Probe documents (.probe)|*.probe"; + //bool? result = dlg.ShowDialog(); + //if (result == true) + //{ + // // Open document + // string filename = dlg.FileName; + // return Load(filename); + //} + return null; + } + + + public static ArgyllProbe Load(string path) + { + ArgyllProbe probe = null; + + XmlSerializer deserializer = new XmlSerializer(typeof(ArgyllProbe)); + + try + { + TextReader reader = new StreamReader(path); + probe = (ArgyllProbe)deserializer.Deserialize(reader); + reader.Close(); + } + catch (FileNotFoundException) + { + + } + + return probe; + } } diff --git a/HLab.Sys/HLab.Sys.Windows.MonitorVcp.Avalonia/DrawingContextExtention.cs b/HLab.Sys/HLab.Sys.Windows.MonitorVcp.Avalonia/DrawingContextExtention.cs index 005785c0..34490836 100644 --- a/HLab.Sys/HLab.Sys.Windows.MonitorVcp.Avalonia/DrawingContextExtention.cs +++ b/HLab.Sys/HLab.Sys.Windows.MonitorVcp.Avalonia/DrawingContextExtention.cs @@ -14,9 +14,9 @@ public static void DrawContrast(this DrawingContext dc, Color colorA, Color col { var hz = orientation == Orientation.Horizontal; var length = (hz?area.Width:area.Height)/count; - var w = (hz?area.Height:area.Width)/2; + var w = (hz?area.Height:area.Width); - var location = area.TopLeft; // was Location + var location = area.TopLeft; var size = hz?new Size(length,w):new Size(w,length); var move = hz ? new Vector(length, 0) : new Vector(0, length); @@ -24,7 +24,6 @@ public static void DrawContrast(this DrawingContext dc, Color colorA, Color col var dG = colorA.G < colorB.G ? +1 : colorA.G > colorB.G? -1 : 0; var dB = colorA.B < colorB.B ? +1 : colorA.B > colorB.B? -1 : 0; - var color = colorA; for (var i = 0; i < count; i++) { @@ -32,22 +31,6 @@ public static void DrawContrast(this DrawingContext dc, Color colorA, Color col dc.RenderCircle(color,colorA,new Rect(location,size)); location += move; } - - location = area.TopLeft + (hz ? new Vector(0,w) : new Vector(w,0)); - - dR = -dR; - dG = -dG; - dB = -dB; - - color = colorB; - for (var i = 0; i < count; i++) - { - color = new Color(0xFF,(byte)((int)color.R+dR), (byte)((int)color.G + dG) , (byte)((int)color.B + dB)); - dc.RenderCircle(color,colorB,new Rect(location,size)); - location += move; - } - - } public static void DrawChessboard(this DrawingContext dc, Color colorA, Color colorB, Rect area, Size size) @@ -205,15 +188,10 @@ public static void DrawGradient(this DrawingContext dc, IColor colorA, I { var gc = new GradientCalculator(colorA,colorB,gamma); - var brush = new SolidColorBrush(); - var length = orientation == Orientation.Horizontal ? area.Width : area.Height; if (length>500) { } - var bench = new Stopwatch(); - bench.Start(); - if (orientation == Orientation.Horizontal) { for (var p = 0.0; p < length; p++) @@ -231,10 +209,6 @@ public static void DrawGradient(this DrawingContext dc, IColor colorA, I } } - - bench.Stop(); - Debug.WriteLine("Gradient : " + area + " : " + bench.ElapsedTicks); - } class GradientCalculator diff --git a/HLab.Sys/HLab.Sys.Windows.MonitorVcp.Avalonia/TestPattern.cs b/HLab.Sys/HLab.Sys.Windows.MonitorVcp.Avalonia/TestPattern.cs index 3780cd0e..77a65664 100644 --- a/HLab.Sys/HLab.Sys.Windows.MonitorVcp.Avalonia/TestPattern.cs +++ b/HLab.Sys/HLab.Sys.Windows.MonitorVcp.Avalonia/TestPattern.cs @@ -37,7 +37,8 @@ public enum TestPatternType Solid, Gradient, Circle, - Circles, + Contrast, + ContrastBoth, Grid, Gamma } @@ -123,23 +124,45 @@ public Color PatternColorB { c._onRender = e.NewValue.Value switch { - TestPatternType.Solid => (dc, rect, colorA, colorB, orient) + TestPatternType.Solid => (dc, rect, colorA, colorB, orientation) => dc.DrawRectangle(new SolidColorBrush(colorA), null, rect), - TestPatternType.Gradient => (dc, rect, colorA, colorB, orient) - => dc.DrawGradient(colorA.ToColor(), colorB.ToColor(), rect, orient, 1.0 / 2.2 /*2.124*/), + TestPatternType.Gradient => (dc, rect, colorA, colorB, orientation) + => dc.DrawGradient(colorA.ToColor(), colorB.ToColor(), rect, orientation, 1.0 / 2.2 /*2.124*/), - TestPatternType.Circle => (dc, rect, colorA, colorB, orient) + TestPatternType.Circle => (dc, rect, colorA, colorB, orientation) => dc.RenderCircle(colorA, colorB, rect), - TestPatternType.Circles => (dc, rect, colorA, colorB, orient) - => dc.DrawContrast(colorA, colorB, rect, 5, orient), + TestPatternType.ContrastBoth => (dc, rect, colorA, colorB, orientation) + => + { + Rect rectA, rectB; + if (orientation == Orientation.Vertical) + { + rectA = new Rect(rect.X, rect.Y, rect.Width / 2, rect.Height); + rectB = new Rect(rect.X + rect.Width / 2, rect.Y, rect.Width / 2, rect.Height); + } + else + { + rectA = new Rect(rect.X, rect.Y, rect.Width, rect.Height / 2); + rectB = new Rect(rect.X, rect.Y + rect.Height / 2, rect.Width, rect.Height / 2); + } + + dc.DrawContrast(colorB, colorA, rectA, 5, orientation); + dc.DrawContrast(colorA, colorB, rectB, 5, orientation); + }, + + TestPatternType.Contrast => (dc, rect, colorA, colorB, orientation) + => + { + dc.DrawContrast(colorA, colorB, rect, 5, orientation); + }, - TestPatternType.Grid => (dc, rect, colorA, colorB, orient) + TestPatternType.Grid => (dc, rect, colorA, colorB, orientation) => dc.DrawHomeCinemaPattern(rect), - TestPatternType.Gamma => (dc, rect, colorA, colorB, orient) - => dc.DrawGamma(colorA.ToColor(), colorB.ToColor(), rect, orient), + TestPatternType.Gamma => (dc, rect, colorA, colorB, orientation) + => dc.DrawGamma(colorA.ToColor(), colorB.ToColor(), rect, orientation), _ => throw new ArgumentOutOfRangeException() }; diff --git a/HLab.Sys/HLab.Sys.Windows.MonitorVcp/MonitorRgbLevel.cs b/HLab.Sys/HLab.Sys.Windows.MonitorVcp/MonitorRgbLevel.cs index 44c8f4a3..e02611d9 100644 --- a/HLab.Sys/HLab.Sys.Windows.MonitorVcp/MonitorRgbLevel.cs +++ b/HLab.Sys/HLab.Sys.Windows.MonitorVcp/MonitorRgbLevel.cs @@ -1,4 +1,6 @@ using System; +using System.Collections.Generic; +using System.Linq; using Avalonia.Styling; using ReactiveUI; @@ -6,26 +8,48 @@ namespace HLab.Sys.Windows.MonitorVcp; public class MonitorRgbLevel : ReactiveObject { - readonly MonitorLevel[] _values = new MonitorLevel[3]; - - public MonitorRgbLevel(CommandWorker parser, VcpGetter getter, VcpSetter setter) - { - for (var i = 0; i < 3; i++) - _values[i] = new MonitorLevel(parser, getter, setter, (VcpComponent)i); - } - - public MonitorRgbLevel Start() - { - foreach (var level in _values) - level.Start(); - - return this; - } - - public MonitorLevel Channel(uint channel) { return _values[channel]; } - - public MonitorLevel Red => Channel(0); - public MonitorLevel Green => Channel(1); - public MonitorLevel Blue => Channel(2); - + readonly MonitorLevel[] _values = new MonitorLevel[3]; + + public MonitorRgbLevel(CommandWorker parser, VcpGetter getter, VcpSetter setter) + { + for (var i = 0; i < 3; i++) + _values[i] = new MonitorLevel(parser, getter, setter, (VcpComponent)i); + } + + public MonitorRgbLevel Start() + { + foreach (var level in _values) + level.Start(); + + return this; + } + + public MonitorLevel Channel(uint channel) { return _values[channel]; } + + public MonitorLevel Red => Channel(0); + public MonitorLevel Green => Channel(1); + public MonitorLevel Blue => Channel(2); + + public void SetToMax() + { + foreach (var level in _values) + level.SetToMax(); + } + + public void SetToMin() + { + foreach (var level in _values) + level.SetToMin(); + } + + public void SetTo(uint[] value) + { + for (var i = 0; i < value.Length; i++) + { + if(_values.Length <= i) break; + _values[i].Value = value[i]; + } + } + + public uint[] GetValues() => _values.Select(t => t.Value).ToArray(); } \ No newline at end of file diff --git a/HLab.Sys/HLab.Sys.Windows.MonitorVcp/ProbeLut.cs b/HLab.Sys/HLab.Sys.Windows.MonitorVcp/ProbeLut.cs index a2b5c62f..1e5089eb 100644 --- a/HLab.Sys/HLab.Sys.Windows.MonitorVcp/ProbeLut.cs +++ b/HLab.Sys/HLab.Sys.Windows.MonitorVcp/ProbeLut.cs @@ -24,9 +24,13 @@ You should have received a copy of the GNU General Public License #nullable enable using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.IO; using System.Linq; +using System.Reactive.Linq; using System.Xml.Serialization; +using DynamicData; +using DynamicData.Binding; using HLab.Sys.Argyll; using HLab.Sys.Windows.Monitors; using ReactiveUI; @@ -35,213 +39,315 @@ namespace HLab.Sys.Windows.MonitorVcp; public class ProbeLut : ReactiveObject { - public ProbedColor DIlluminant { get; } + //public ProbedColor DIlluminant { get; } + + readonly MonitorDevice _monitor; + + readonly SourceList _lut = new(); + + + readonly ReadOnlyObservableCollection _sortedLut; + public ReadOnlyObservableCollection SortedLut => _sortedLut; + + readonly SourceList _smoothLut = new(); + readonly ReadOnlyObservableCollection _smoothLutCollection; + public ReadOnlyObservableCollection SmoothLut => _smoothLutCollection; + + internal ProbeLut(MonitorDevice monitor) + { + _monitor = monitor; + Vcp = _monitor.Vcp(); + + _luminance = this.WhenAnyValue( + e => e.Vcp.Brightness.Value, + selector: e => GetLuminance() + ).ToProperty(this, _ => _.Luminance); + + _lut + .Connect() + .Sort(SortExpressionComparer.Ascending(t => t.Y)) + .ObserveOn(RxApp.MainThreadScheduler) + .Bind(out _sortedLut) + .Subscribe(); + + _smoothLut + .Connect() + .Sort(SortExpressionComparer.Ascending(t => t.Y)) + .ObserveOn(RxApp.MainThreadScheduler) + .Bind(out _smoothLutCollection) + .Subscribe(); + } + + public (double Slope, double Intercept) LinearRegression(IEnumerablelist, Func getX, Func getY) + { + var sumX = 0.0; + var sumY = 0.0; + var sumXY = 0.0; + var sumX2 = 0.0; + var n = _sortedLut.Count; + + foreach (var tune in list) + { + var x = getX(tune); + var y = getY(tune); + + sumX += x; + sumY += y; + sumXY += x * y; + sumX2 += x * x; + } + + var slope = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX); + var intercept = (sumY - slope * sumX) / n; + + return (slope, intercept); + } + + public void GenerateSmoothedCurve() + { + _smoothLut.Clear(); + + var(slopeY,interceptY) = LinearRegression(_sortedLut, t => t.Brightness, t => t.Y); + var(slopeR,interceptR) = LinearRegression(_sortedLut, t => t.Brightness, t => t.Red); + var(slopeG,interceptG) = LinearRegression(_sortedLut, t => t.Brightness, t => t.Green); + var(slopeB,interceptB) = LinearRegression(_sortedLut, t => t.Brightness, t => t.Blue); + + var start = (int)_sortedLut.First().Brightness; + var end = (int)_sortedLut.Last().Brightness; + + for (var i=start; i x.Brightness == brightness); + if (t == null) return false; - List _lut = new(); + _lut.Remove(t); + return true; + } - internal ProbeLut(MonitorDevice monitor) - { - _monitor = monitor; - - _luminance = this.WhenAnyValue( - e => e.Vcp.Brightness.Value, - selector: e => GetLuminance() - ).ToProperty(this, _ => _.Luminance); - } - - public VcpControl Vcp => _monitor.Vcp(); - - public bool RemoveBrightness(double brightness) - { - var t = _lut.FirstOrDefault(x => x.Brightness == brightness); - if (t == null) return false; - - _lut.Remove(t); - return true; - } - - public bool RemoveLowBrightness(double maxGain) - { - var t = _lut.FirstOrDefault(x => (x.Brightness == 0 && x.MaxGain == maxGain)); - if (t == null) return false; - - _lut.Remove(t); - return true; - } - - public void Add(Tune tune) - { - _lut.Add(tune); - - _lut = _lut.OrderBy(x => x.Y).ToList(); - } - - public Tune FromLuminance(double luminance) - { - if (_lut.Count == 0) return Current; - - Tune tSup = null; - Tune tInf = null; - - var i = 0; - for (; i < _lut.Count && _lut[i].Y < luminance; i++) - tInf = _lut[i]; - - // luminance is more than monitor capabilities - if (i >= _lut.Count) return tInf; - - tSup = _lut[i]; - - if (tInf == null) return tSup; - - var dist = tSup.Y - tInf.Y; - var ratio = (luminance - tInf.Y) / dist; - - var t = new Tune - { - Y = (uint)Math.Round(tInf.Y + (tSup.Y - tInf.Y) * ratio, 0), - x = (uint)Math.Round(tInf.x + (tSup.x - tInf.x) * ratio, 0), - y = (uint)Math.Round(tInf.y + (tSup.y - tInf.y) * ratio, 0), - - Brightness = (uint)Math.Round(tInf.Brightness + (tSup.Brightness - tInf.Brightness) * ratio, 0), - Contrast = (uint)Math.Round(tInf.Contrast + (tSup.Contrast - tInf.Contrast) * ratio, 0), - - Red = (uint)Math.Round(tInf.Red + (tSup.Red - tInf.Red) * ratio, 0), - Blue = (uint)Math.Round(tInf.Blue + (tSup.Blue - tInf.Blue) * ratio, 0), - Green = (uint)Math.Round(tInf.Green + (tSup.Green - tInf.Green) * ratio, 0), - }; - - return t; - } - - public Tune FromBrightness(double brightness) - { - if (_lut.Count == 0) return Current; - - Tune tSup = null; - Tune tInf = null; - - var i = 0; - for (; i < _lut.Count && _lut[i].Brightness < brightness; i++) - tInf = _lut[i]; - - // luminance is more than monitor capabilities - if (i >= _lut.Count) return tInf; - - tSup = _lut[i]; - - if (tInf == null) return tSup; - - var dist = tSup.Brightness - tInf.Brightness; - var ratio = (brightness - tInf.Brightness) / dist; - - var t = new Tune - { - Y = (uint)Math.Round(tInf.Y + (tSup.Y - tInf.Y) * ratio, 0), - x = (uint)Math.Round(tInf.x + (tSup.x - tInf.x) * ratio, 0), - y = (uint)Math.Round(tInf.y + (tSup.y - tInf.y) * ratio, 0), - - Brightness = (uint)Math.Round(tInf.Brightness + (tSup.Brightness - tInf.Brightness) * ratio, 0), - Contrast = (uint)Math.Round(tInf.Contrast + (tSup.Contrast - tInf.Contrast) * ratio, 0), - - Red = (uint)Math.Round(tInf.Red + (tSup.Red - tInf.Red) * ratio, 0), - Blue = (uint)Math.Round(tInf.Blue + (tSup.Blue - tInf.Blue) * ratio, 0), - Green = (uint)Math.Round(tInf.Green + (tSup.Green - tInf.Green) * ratio, 0), - }; - - return t; - } - - double GetLuminance() => FromBrightness(Vcp.Brightness.Value).Y; - - void SetLuminance(double luminance) - { - var t = FromLuminance(luminance); - Vcp.Brightness.Value = (uint)Math.Round(t.Brightness, 0); - Vcp.Contrast.Value = (uint)Math.Round(t.Contrast, 0); - Vcp.Gain.Red.Value = (uint)Math.Round(t.Red, 0); - Vcp.Gain.Blue.Value = (uint)Math.Round(t.Blue, 0); - Vcp.Gain.Green.Value = (uint)Math.Round(t.Green, 0); - } - - public Tune Current => new Tune - { - Brightness = Vcp.Brightness.Value, - Contrast = Vcp.Contrast.Value, - Red = Vcp.Gain.Red.Value, - Blue = Vcp.Gain.Blue.Value, - Green = Vcp.Gain.Green.Value, - }; - - public double Luminance - { - get => _luminance.Value; - set => SetLuminance(value); - } - readonly ObservableAsPropertyHelper _luminance; - - public double MaxLuminance => - (_lut.Count == 0) ? 1 : _lut.Last().Y; - - public double MinLuminance => - (_lut.Count == 0) ? 0 : _lut.First().Y; - - string GetConfigPath(bool create = false) - { - var path = Path.Combine( - Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), - "Mgth", "LittleBigMouse" - ); - path = Path.Combine(path, _monitor.Id); - path = Path.Combine(path, "Luminance.xml"); - - if(create) Directory.CreateDirectory(path); - - return path; - } - - public void Save() - { - var serializer = new XmlSerializer(typeof(List)); - using TextWriter writer = new StreamWriter(GetConfigPath(true)); - - serializer.Serialize(writer, _lut); - } - - public void Load() - { - var deserializer = new XmlSerializer(typeof(List)); - try - { - using TextReader reader = new StreamReader(GetConfigPath()); - _lut = (List)deserializer.Deserialize(reader); + public bool RemoveLowBrightness(double maxGain) + { + var t = _sortedLut.FirstOrDefault(x => (x.Brightness == 0 && x.MaxGain == maxGain)); + if (t == null) return false; + + _lut.Remove(t); + return true; + } + + public void Add(Tune tune) + { + _lut.Add(tune); + } + + public Tune FromLuminance(double luminance) + { + if (_sortedLut.Count == 0) return Current; + + Tune tSup = null; + Tune tInf = null; + + var i = 0; + for (; i < _sortedLut.Count && _sortedLut[i].Y < luminance; i++) + tInf = _sortedLut[i]; + + // luminance is more than monitor capabilities + if (i >= _sortedLut.Count) return tInf; + + tSup = _sortedLut[i]; + + if (tInf == null) return tSup; + + var dist = tSup.Y - tInf.Y; + var ratio = (luminance - tInf.Y) / dist; + + var t = new Tune + { + Date = tSup.Date > tInf.Date ? tSup.Date : tInf.Date, + + Y = (uint)Math.Round(tInf.Y + (tSup.Y - tInf.Y) * ratio, 0), + x = (uint)Math.Round(tInf.x + (tSup.x - tInf.x) * ratio, 0), + y = (uint)Math.Round(tInf.y + (tSup.y - tInf.y) * ratio, 0), + + Brightness = (uint)Math.Round(tInf.Brightness + (tSup.Brightness - tInf.Brightness) * ratio, 0), + Contrast = (uint)Math.Round(tInf.Contrast + (tSup.Contrast - tInf.Contrast) * ratio, 0), + + Red = (uint)Math.Round(tInf.Red + (tSup.Red - tInf.Red) * ratio, 0), + Blue = (uint)Math.Round(tInf.Blue + (tSup.Blue - tInf.Blue) * ratio, 0), + Green = (uint)Math.Round(tInf.Green + (tSup.Green - tInf.Green) * ratio, 0), + }; + + return t; + } + + public Tune FromBrightness(double brightness) + { + if (_sortedLut is null) return Current; + if (_sortedLut.Count == 0) return Current; + + Tune tSup = null; + Tune tInf = null; + + var i = 0; + for (; i < _sortedLut.Count && _sortedLut[i].Brightness < brightness; i++) + tInf = _sortedLut[i]; + + // luminance is more than monitor capabilities + if (i >= _lut.Count) return tInf; + + tSup = _sortedLut[i]; + + if (tInf == null) return tSup; + + var dist = tSup.Brightness - tInf.Brightness; + var ratio = (brightness - tInf.Brightness) / dist; + + var t = new Tune + { + Date = tSup.Date > tInf.Date ? tSup.Date : tInf.Date, + + Y = (uint)Math.Round(tInf.Y + (tSup.Y - tInf.Y) * ratio, 0), + x = (uint)Math.Round(tInf.x + (tSup.x - tInf.x) * ratio, 0), + y = (uint)Math.Round(tInf.y + (tSup.y - tInf.y) * ratio, 0), + + Brightness = (uint)Math.Round(tInf.Brightness + (tSup.Brightness - tInf.Brightness) * ratio, 0), + Contrast = (uint)Math.Round(tInf.Contrast + (tSup.Contrast - tInf.Contrast) * ratio, 0), + + Red = (uint)Math.Round(tInf.Red + (tSup.Red - tInf.Red) * ratio, 0), + Blue = (uint)Math.Round(tInf.Blue + (tSup.Blue - tInf.Blue) * ratio, 0), + Green = (uint)Math.Round(tInf.Green + (tSup.Green - tInf.Green) * ratio, 0), + }; + + return t; + } + + double GetLuminance() => FromBrightness(Vcp.Brightness.Value).Y; + + void SetLuminance(double luminance) + { + var t = FromLuminance(luminance); + Vcp.Brightness.Value = (uint)Math.Round(t.Brightness, 0); + Vcp.Contrast.Value = (uint)Math.Round(t.Contrast, 0); + Vcp.Gain.Red.Value = (uint)Math.Round(t.Red, 0); + Vcp.Gain.Blue.Value = (uint)Math.Round(t.Blue, 0); + Vcp.Gain.Green.Value = (uint)Math.Round(t.Green, 0); + } + + public Tune Current + { + get + { + var vcp = Vcp; + var gain = vcp?.Gain; + if (vcp is null || gain is null) return new(); + return new() + { + Date = DateTime.Now, + Brightness = vcp.Brightness?.Value??0, + Contrast = vcp.Contrast?.Value??0, + Red = gain.Red.Value, + Blue = gain.Blue.Value, + Green = gain.Green.Value, + }; + } + } + + public double Luminance + { + get => _luminance.Value; + set => SetLuminance(value); + } + readonly ObservableAsPropertyHelper _luminance; + + public double MaxLuminance => + (_sortedLut.Count == 0) ? 1 : _sortedLut.Last().Y; + + public double MinLuminance => + (_sortedLut.Count == 0) ? 0 : _sortedLut.First().Y; + + string GetConfigPath(bool create = false) + { + var path = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), + "Mgth", "LittleBigMouse" + ); + path = Path.Combine(path, _monitor.Id); + if (create) Directory.CreateDirectory(path); + + path = Path.Combine(path, "Luminance.xml"); + + return path; + } + + public void Save() + { + var serializer = new XmlSerializer(typeof(List)); + using TextWriter writer = new StreamWriter(GetConfigPath(true)); + + serializer.Serialize(writer, SortedLut.ToList()); + } + + public void Load() + { + var deserializer = new XmlSerializer(typeof(List)); + try + { + using TextReader reader = new StreamReader(GetConfigPath()); + try + { + var lut = deserializer.Deserialize(reader) as IEnumerable; + if(lut is null) throw new Exception(); + + _lut.Clear(); + foreach (var tune in lut) _lut.Add(tune); + + GenerateSmoothedCurve(); + } + finally + { reader.Close(); - } - catch (IOException ex) when(ex is FileNotFoundException or DirectoryNotFoundException) - { - _lut = new List - { - new() - { - Brightness = MinLuminance, - Y = 0, - Red = Vcp.Gain?.Red.Value ?? 0, - Blue = Vcp.Gain?.Blue.Value ?? 0, - Green = Vcp.Gain?.Green.Value ?? 0, - Contrast = Vcp.Contrast?.Value ?? 0 - }, - new() - { - Brightness = MaxLuminance, - Y = 160, - Red = Vcp.Gain?.Red.Value ?? 0, - Blue = Vcp.Gain?.Blue.Value ?? 0, - Green = Vcp.Gain?.Green.Value ?? 0, - Contrast = Vcp.Contrast?.Value ?? 0 - }, - }; - } - } + } + + } + catch (IOException ex) when (ex is FileNotFoundException or DirectoryNotFoundException) + { + _lut.Clear(); + + _lut.Add(new() + { + Brightness = MinLuminance, + Y = 0, + Red = Vcp.Gain?.Red.Value ?? 0, + Blue = Vcp.Gain?.Blue.Value ?? 0, + Green = Vcp.Gain?.Green.Value ?? 0, + Contrast = Vcp.Contrast?.Value ?? 0 + } + ); + + _lut.Add(new() + { + Brightness = MaxLuminance, + Y = 160, + Red = Vcp.Gain?.Red.Value ?? 0, + Blue = Vcp.Gain?.Blue.Value ?? 0, + Green = Vcp.Gain?.Green.Value ?? 0, + Contrast = Vcp.Contrast?.Value ?? 0 + } + ); + } + } } \ No newline at end of file diff --git a/HLab.Sys/HLab.Sys.Windows.MonitorVcp/Tune.cs b/HLab.Sys/HLab.Sys.Windows.MonitorVcp/Tune.cs index fc079efd..8b20ca23 100644 --- a/HLab.Sys/HLab.Sys.Windows.MonitorVcp/Tune.cs +++ b/HLab.Sys/HLab.Sys.Windows.MonitorVcp/Tune.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System; +using System.Linq; using System.Xml.Serialization; namespace HLab.Sys.Windows.MonitorVcp; @@ -21,6 +22,8 @@ public class Tune public double Green; [XmlAttribute] public double Blue; + [XmlAttribute] + public DateTime Date; public double MaxGain => new[]{Red, Green, Blue}.Max(); public double MinGain => new[] { Red, Green, Blue }.Min(); diff --git a/LittleBigMouse.Hook.Rust/.vs/LittleBigMouse.Hook.Rust/CopilotIndices/17.14.260.54502/CodeChunks.db b/LittleBigMouse.Hook.Rust/.vs/LittleBigMouse.Hook.Rust/CopilotIndices/17.14.260.54502/CodeChunks.db new file mode 100644 index 0000000000000000000000000000000000000000..aa5d6e1877ba096aaa27cf3251fef8ec933c4dcf GIT binary patch literal 69632 zcmeI&O>g5w7{GD6+l|w_wCTyGO0KGsM7vrxsw%_*iI6(QZ0dAV7g`Avg~q!Zwsp2` zDwdc&T`lbvi^~p*kjMw&+nP>B$^&Q?M-I3_H24} zF`8*RQcYS~l0MZmNs`LqZ(aOFuaekUj&{VSoY-EpS(Y9>`>VS4k5p5-((0dUzpehf z`a$)g`gi50@}r7X`gP^I;vYq+_>0n2eqYoG

~v00Id7KLy;%nxd+z?0!EReS2025)&8ufYjwY@t~IJ9O}y&HxULzdrSIzl&Fov6dED!1hXdoFJvh~# z=%-ry*yoU#4-`tn@N z@Wau~Z0he1{rba}|FQ0FR26k=OTLx;J2$)<_P9Gaw-cMI=_nFM-ZvKSLWiT-i-n== zt`<~dYf&hPI~leTJ8N#OqNv7>?6xLeM8?Um^Ww&N>Bro?vM+CJ=j?}|%ot}Js)i98 z=AM2c67|mdb**n|^^8`8PEafo-Mlr+in_BSzv=kW8K-9yRnqbqXT%xs4`y|#RLA+x z6W;RN?VDjk-Tpu~_D!#cHo}WGwSnH%2fEqOk2JsRVD#$M#ChH@#!ZiBPw(ks9CX@8 zo%Wud(U6}S@8m>7epz-4qL*Km6!qh6*h`w$W+l#Hcv>>(m5i*#t-aUaH%AwC_F##!+_RnM-hi5autdkhSQZ^mCO0@W zm6F6DTbP)SRtoBq?L}iY2{mjb_e$Se9lHRovAako%!c#MrZYJCFPQgV&H-QQf4ocMafR=lk^%Zj?YA-ifc)b^%lHy47+A7me==wu-Ya~7_6+Tfn_yP^vOVa0-X1h|A3tu!6LqKG>v`V_ z%)WRYMi0Y!Z*)ET>PpPj*5txIo}Jz8vte=r+eUPirpW4tO9i#Fu_&uiIKx)7bx(Yc zDth0gs@_}8d*g)w0tg_000IagfB*srAb;L)BF%cqw00IagfB*srAbt>u literal 0 HcmV?d00001 diff --git a/LittleBigMouse.Hook.Rust/.vs/LittleBigMouse.Hook.Rust/CopilotIndices/17.14.260.54502/SemanticSymbols.db b/LittleBigMouse.Hook.Rust/.vs/LittleBigMouse.Hook.Rust/CopilotIndices/17.14.260.54502/SemanticSymbols.db new file mode 100644 index 0000000000000000000000000000000000000000..330f6d0d57e6ebf2865f55f4876407ffcbef73e6 GIT binary patch literal 49152 zcmeI)U2ob}7zc11l0e8?r(K||igwgVGpHo#G)0wKbsGUE^-4_(rY~A0~o&q^Bm*IRqOXF z7Ng|E^|}TlA15v)78Vkp5t2wGR`~B4|BV*0z8HPr@6yQnwAGcw?#b`#n|~!XmX;D5 zzis}!@x#W4t6yjS$$XdoHT@*@Q|goDAD4dNJF!3j0ucB=1p1$Eq%L3GN`LhQ^Q?B8 zdb-!Hzw92nw(9uQW5Ifa=|H4+@Oo;gsCRBb&& z_!90^HN6_{F1g)Pn=;FFa-Mr;nFZ2tp7jjdI8=NpRNyrdHqg2m@?&E(KiPZvfK`PF}b5WE|BMW@=(=pR~tI1RUfM5{?ckHd+V0e-<~`M({1_ItBYd`x3A6^Mc7Qv zSthR?T@htBHXi>KIjB?*^8I%+sqFr~)K@2u!!lo72$65g%;=vtk#jz6i@Idg>lVmq z+i?q{V;J3?kLi55lFDAcJ{`wk#)VOteB;WDVTm@=O^$81^)z64EvHl2ot^Zz$%!oS z&ckjWs5QM&tPp*2ZOEiiSG6N@!u{B~{E_1b%)|J@Gj z+8@vtJUNbGi>ejh=A>2z#feuE$8%^(bjmhkAxh{NAz8&*iiUzlm&h_{x76^{^j4 zuslnpvY&48Qn4J9zEB@EgWNP@u))@Jm?%{%E02ggwY4m+T;bf7N$x_H^8LkSK5cln zN3m|pZmZYjlByZ>n3~q(dBb>TBYO%&R(OgWR%eFCcqN1%E7WPTj-3DI{iRfPYfJim z^hy?VygX?t@L0mSQ%!l&g@F_sdR5i`+#PSkrU8+_p;;T}tmWp-pHhwU_8VlS&BO1!IRw2^VX5ve7 z#+gKuS*JO0&6hJyBbv-Q&1jyd4moHv>r_Dj+~JjZp5wUWUCKJHS-0Ab!FnDYPeYii z!)i@Yk2LWGmOC$jJgF&%N=?y9{H`L}oKwxbm^0z`K2Kh$SXTJ-bQbwM*_Qg*Xr4qz zG!HGC-ZNMy+OQNBY(rD;Hxy0~P0^^q@Q7f-M4QF@jLs$J?9&-nun^Ba_kD|3C zzs*jITkUo6a!I^kfdB*`009U<00Izz00bZa0SG`~UIj8DF#P>Lujxfx5P$##AOHaf zKmY;|fB*y_0D*x3p8ul|AOHafKmY;|fB*y_009U<00Q$bfam}7pJPM_0SG_<0uX=z z1Rwwb2tWV=5Ww?))Bpq^009U<00Izz00bZa0SG`~{sr*-fBtif2q6Fg2tWV=5P$## zAOHafKmY>x`yVv`0SG_<0uX=z1Rwwb2tWV=5SV`f@$df^HvdR${>@*oKmY;|fB*y_ z009U<00Izz00bZ~4+5D?GVxv*NK#5B*6{p)9@2^!AOHafKmY;|fB*y_009U<00M6o z!2kdEW*_W@00bZa0SG_<0uX=z1Rwwb2+V_kc>XVK{+ZxESReoa2tWV=5P$##AOHaf WKmY;|m?MGJq literal 0 HcmV?d00001 diff --git a/LittleBigMouse.Hook.Rust/.vs/LittleBigMouse.Hook.Rust/v17/.wsuo b/LittleBigMouse.Hook.Rust/.vs/LittleBigMouse.Hook.Rust/v17/.wsuo new file mode 100644 index 0000000000000000000000000000000000000000..7b712bef3e4ae7eda8acc4c04f9e440d50626de6 GIT binary patch literal 193024 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 U>x|n^UM~J7+w+6(OB;dz4?Z(^$p8QV literal 0 HcmV?d00001 diff --git a/LittleBigMouse.Hook.Rust/.vs/LittleBigMouse.Hook.Rust/v17/DocumentLayout.json b/LittleBigMouse.Hook.Rust/.vs/LittleBigMouse.Hook.Rust/v17/DocumentLayout.json new file mode 100644 index 00000000..5caf6749 --- /dev/null +++ b/LittleBigMouse.Hook.Rust/.vs/LittleBigMouse.Hook.Rust/v17/DocumentLayout.json @@ -0,0 +1,73 @@ +{ + "Version": 1, + "WorkspaceRootPath": "L:\\Docs\\_docs_\\_projets\\_HLab_Projects_2023\\LittleBigMouse\\LittleBigMouse.Hook.Rust\\", + "Documents": [], + "DocumentGroupContainers": [ + { + "Orientation": 1, + "VerticalTabListWidth": 248, + "DocumentGroups": [ + { + "DockedHeight": 584, + "SelectedChildIndex": -1, + "Children": [ + { + "$type": "Bookmark", + "Name": "ST:0:0:{e506b91c-c606-466a-90a9-123d1d1e12b3}" + }, + { + "$type": "Bookmark", + "Name": "ST:128:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:128:0:{13b12e3e-c1b4-4539-9371-4fe9a0d523fc}" + } + ] + }, + { + "DockedHeight": 274, + "SelectedChildIndex": -1, + "Children": [ + { + "$type": "Bookmark", + "Name": "ST:129:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{a80febb4-e7e0-4147-b476-21aaf2453969}" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{8294f124-07d1-574c-bf4d-1c4a34e31c86}" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{34e76e81-ee4a-11d0-ae2e-00a0c90fffc3}" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{d78612c7-9962-4b83-95d9-268046dad23a}" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{004be353-6879-467c-9d1e-9ac23cdf6d49}" + }, + { + "$type": "Bookmark", + "Name": "ST:130:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:131:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{5726b0e3-1012-5233-81f9-d1fad48e7a56}" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/LittleBigMouse.Hook.Rust/.vs/ProjectSettings.json b/LittleBigMouse.Hook.Rust/.vs/ProjectSettings.json new file mode 100644 index 00000000..f8b48885 --- /dev/null +++ b/LittleBigMouse.Hook.Rust/.vs/ProjectSettings.json @@ -0,0 +1,3 @@ +{ + "CurrentProjectSetting": null +} \ No newline at end of file diff --git a/LittleBigMouse.Hook.Rust/.vs/VSWorkspaceState.json b/LittleBigMouse.Hook.Rust/.vs/VSWorkspaceState.json new file mode 100644 index 00000000..6b611411 --- /dev/null +++ b/LittleBigMouse.Hook.Rust/.vs/VSWorkspaceState.json @@ -0,0 +1,6 @@ +{ + "ExpandedNodes": [ + "" + ], + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/LittleBigMouse.Hook.Rust/.vs/slnx.sqlite b/LittleBigMouse.Hook.Rust/.vs/slnx.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..15c2eaea20ee3d1029cd5bfd5dafbfb5a0005046 GIT binary patch literal 90112 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 - + diff --git a/LittleBigMouse.Plugins/LittleBigMouse.Plugin.Vcp.Avalonia/VcpScreenView.axaml b/LittleBigMouse.Plugins/LittleBigMouse.Plugin.Vcp.Avalonia/VcpScreenView.axaml index 1070c1c6..85a7b0ee 100644 --- a/LittleBigMouse.Plugins/LittleBigMouse.Plugin.Vcp.Avalonia/VcpScreenView.axaml +++ b/LittleBigMouse.Plugins/LittleBigMouse.Plugin.Vcp.Avalonia/VcpScreenView.axaml @@ -5,7 +5,7 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:vcp.Avalonia="clr-namespace:LittleBigMouse.Plugin.Vcp.Avalonia" xmlns:mvvm.Avalonia="clr-namespace:HLab.Mvvm.Avalonia;assembly=HLab.Mvvm.Avalonia" - xmlns:avalonia="clr-namespace:ScottPlot.Avalonia;assembly=ScottPlot.Avalonia" + xmlns:avalonia="clr-namespace:LiveChartsCore.SkiaSharpView.Avalonia;assembly=LiveChartsCore.SkiaSharpView.Avalonia" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="615.613" x:DataType="vcp.Avalonia:VcpScreenViewModel" @@ -15,7 +15,7 @@ - + @@ -61,8 +61,6 @@ - - @@ -72,7 +70,25 @@ - + + + + + +