diff --git a/src/Artemis.Core/Extensions/RgbDeviceExtensions.cs b/src/Artemis.Core/Extensions/RgbDeviceExtensions.cs index 1e15c8fab..1ef6ba8dd 100644 --- a/src/Artemis.Core/Extensions/RgbDeviceExtensions.cs +++ b/src/Artemis.Core/Extensions/RgbDeviceExtensions.cs @@ -1,5 +1,6 @@ using System.Text; using RGB.NET.Core; +using SkiaSharp; namespace Artemis.Core { @@ -20,4 +21,17 @@ namespace Artemis.Core return builder.ToString(); } } + + internal static class RgbRectangleExtensions + { + public static SKRect ToSKRect(this Rectangle rectangle) + { + return SKRect.Create( + (float) rectangle.Location.X, + (float) rectangle.Location.Y, + (float) rectangle.Size.Width, + (float) rectangle.Size.Height + ); + } + } } \ No newline at end of file diff --git a/src/Artemis.Core/Models/Profile/Layer.cs b/src/Artemis.Core/Models/Profile/Layer.cs index 6c82080fc..2554d7cb1 100644 --- a/src/Artemis.Core/Models/Profile/Layer.cs +++ b/src/Artemis.Core/Models/Profile/Layer.cs @@ -417,7 +417,7 @@ namespace Artemis.Core { SKPath path = new SKPath {FillType = SKPathFillType.Winding}; foreach (ArtemisLed artemisLed in Leds) - path.AddRect(artemisLed.AbsoluteRenderRectangle); + path.AddRect(artemisLed.AbsoluteRectangle); Path = path; } diff --git a/src/Artemis.Core/Models/Surface/ArtemisDevice.cs b/src/Artemis.Core/Models/Surface/ArtemisDevice.cs index f347c932a..776eebde9 100644 --- a/src/Artemis.Core/Models/Surface/ArtemisDevice.cs +++ b/src/Artemis.Core/Models/Surface/ArtemisDevice.cs @@ -14,8 +14,8 @@ namespace Artemis.Core /// public class ArtemisDevice : CorePropertyChanged { - private SKPath? _renderPath; - private SKRect _renderRectangle; + private SKPath? _path; + private SKRect _rectangle; internal ArtemisDevice(IRGBDevice rgbDevice, DeviceProvider deviceProvider, ArtemisSurface surface) { @@ -58,21 +58,21 @@ namespace Artemis.Core } /// - /// Gets the rectangle covering the device, sized to match the render scale + /// Gets the rectangle covering the device /// - public SKRect RenderRectangle + public SKRect Rectangle { - get => _renderRectangle; - private set => SetAndNotify(ref _renderRectangle, value); + get => _rectangle; + private set => SetAndNotify(ref _rectangle, value); } /// - /// Gets the path surrounding the device, sized to match the render scale + /// Gets the path surrounding the device /// - public SKPath? RenderPath + public SKPath? Path { - get => _renderPath; - private set => SetAndNotify(ref _renderPath, value); + get => _path; + private set => SetAndNotify(ref _path, value); } /// @@ -239,24 +239,18 @@ namespace Artemis.Core internal void CalculateRenderProperties() { - RenderRectangle = SKRect.Create( - (RgbDevice.Location.X * Surface.Scale).RoundToInt(), - (RgbDevice.Location.Y * Surface.Scale).RoundToInt(), - (RgbDevice.DeviceRectangle.Size.Width * Surface.Scale).RoundToInt(), - (RgbDevice.DeviceRectangle.Size.Height * Surface.Scale).RoundToInt() - ); - + Rectangle = RgbDevice.DeviceRectangle.ToSKRect(); if (!Leds.Any()) return; foreach (ArtemisLed led in Leds) - led.CalculateRenderRectangle(); + led.CalculateRectangles(); SKPath path = new SKPath {FillType = SKPathFillType.Winding}; foreach (ArtemisLed artemisLed in Leds) - path.AddRect(artemisLed.AbsoluteRenderRectangle); + path.AddRect(artemisLed.AbsoluteRectangle); - RenderPath = path; + Path = path; } #region Events diff --git a/src/Artemis.Core/Models/Surface/ArtemisLed.cs b/src/Artemis.Core/Models/Surface/ArtemisLed.cs index e31594d40..b5915077a 100644 --- a/src/Artemis.Core/Models/Surface/ArtemisLed.cs +++ b/src/Artemis.Core/Models/Surface/ArtemisLed.cs @@ -8,14 +8,14 @@ namespace Artemis.Core /// public class ArtemisLed : CorePropertyChanged { - private SKRect _absoluteRenderRectangle; - private SKRect _renderRectangle; + private SKRect _absoluteRectangle; + private SKRect _rectangle; internal ArtemisLed(Led led, ArtemisDevice device) { RgbLed = led; Device = device; - CalculateRenderRectangle(); + CalculateRectangles(); } /// @@ -29,38 +29,27 @@ namespace Artemis.Core public ArtemisDevice Device { get; } /// - /// Gets the rectangle covering the LED, sized to match the render scale and positioned relative to the - /// + /// Gets the rectangle covering the LED positioned relative to the /// - public SKRect RenderRectangle + public SKRect Rectangle { - get => _renderRectangle; - private set => SetAndNotify(ref _renderRectangle, value); + get => _rectangle; + private set => SetAndNotify(ref _rectangle, value); } /// - /// Gets the rectangle covering the LED, sized to match the render scale + /// Gets the rectangle covering the LED /// - public SKRect AbsoluteRenderRectangle + public SKRect AbsoluteRectangle { - get => _absoluteRenderRectangle; - private set => SetAndNotify(ref _absoluteRenderRectangle, value); + get => _absoluteRectangle; + private set => SetAndNotify(ref _absoluteRectangle, value); } - internal void CalculateRenderRectangle() + internal void CalculateRectangles() { - RenderRectangle = SKRect.Create( - (RgbLed.LedRectangle.Location.X * Device.Surface.Scale).RoundToInt(), - (RgbLed.LedRectangle.Location.Y * Device.Surface.Scale).RoundToInt(), - (RgbLed.LedRectangle.Size.Width * Device.Surface.Scale).RoundToInt(), - (RgbLed.LedRectangle.Size.Height * Device.Surface.Scale).RoundToInt() - ); - AbsoluteRenderRectangle = SKRect.Create( - (RgbLed.AbsoluteLedRectangle.Location.X * Device.Surface.Scale).RoundToInt(), - (RgbLed.AbsoluteLedRectangle.Location.Y * Device.Surface.Scale).RoundToInt(), - (RgbLed.AbsoluteLedRectangle.Size.Width * Device.Surface.Scale).RoundToInt(), - (RgbLed.AbsoluteLedRectangle.Size.Height * Device.Surface.Scale).RoundToInt() - ); + Rectangle = RgbLed.LedRectangle.ToSKRect(); + AbsoluteRectangle = RgbLed.AbsoluteLedRectangle.ToSKRect(); } /// diff --git a/src/Artemis.Core/Models/Surface/ArtemisSurface.cs b/src/Artemis.Core/Models/Surface/ArtemisSurface.cs index 9f88cc73d..ffb574f7e 100644 --- a/src/Artemis.Core/Models/Surface/ArtemisSurface.cs +++ b/src/Artemis.Core/Models/Surface/ArtemisSurface.cs @@ -16,28 +16,25 @@ namespace Artemis.Core private ReadOnlyDictionary _ledMap = new ReadOnlyDictionary(new Dictionary()); private bool _isActive; private string _name; - private double _scale; - internal ArtemisSurface(RGBSurface rgbSurface, string name, double scale) + internal ArtemisSurface(RGBSurface rgbSurface, string name) { SurfaceEntity = new SurfaceEntity {DeviceEntities = new List()}; EntityId = Guid.NewGuid(); RgbSurface = rgbSurface; _name = name; - _scale = scale; _isActive = false; ApplyToEntity(); } - internal ArtemisSurface(RGBSurface rgbSurface, SurfaceEntity surfaceEntity, double scale) + internal ArtemisSurface(RGBSurface rgbSurface, SurfaceEntity surfaceEntity) { SurfaceEntity = surfaceEntity; EntityId = surfaceEntity.Id; RgbSurface = rgbSurface; - _scale = scale; _name = surfaceEntity.Name; _isActive = surfaceEntity.IsActive; } @@ -47,15 +44,6 @@ namespace Artemis.Core /// public RGBSurface RgbSurface { get; } - /// - /// Gets the scale at which this surface is rendered - /// - public double Scale - { - get => _scale; - private set => SetAndNotify(ref _scale, value); - } - /// /// Gets the name of the surface /// @@ -96,19 +84,6 @@ namespace Artemis.Core internal SurfaceEntity SurfaceEntity { get; set; } internal Guid EntityId { get; set; } - /// - /// Updates the scale of the surface - /// - /// - public void UpdateScale(double value) - { - Scale = value; - foreach (ArtemisDevice device in Devices) - device.CalculateRenderProperties(); - - OnScaleChanged(); - } - /// /// Attempts to retrieve the that corresponds the provided RGB.NET /// diff --git a/src/Artemis.Core/Plugins/LayerBrushes/PerLedLayerBrush.cs b/src/Artemis.Core/Plugins/LayerBrushes/PerLedLayerBrush.cs index f9ea640cb..1fecd1b4f 100644 --- a/src/Artemis.Core/Plugins/LayerBrushes/PerLedLayerBrush.cs +++ b/src/Artemis.Core/Plugins/LayerBrushes/PerLedLayerBrush.cs @@ -41,7 +41,7 @@ namespace Artemis.Core.LayerBrushes pointsPath.AddPoly(new[] { new SKPoint(0, 0), - new SKPoint(artemisLed.AbsoluteRenderRectangle.Left - Layer.Bounds.Left, artemisLed.AbsoluteRenderRectangle.Top - Layer.Bounds.Top) + new SKPoint(artemisLed.AbsoluteRectangle.Left - Layer.Bounds.Left, artemisLed.AbsoluteRectangle.Top - Layer.Bounds.Top) }); } @@ -61,10 +61,10 @@ namespace Artemis.Core.LayerBrushes ledPaint.Color = GetColor(artemisLed, renderPoint); SKRect ledRectangle = SKRect.Create( - artemisLed.AbsoluteRenderRectangle.Left - Layer.Bounds.Left, - artemisLed.AbsoluteRenderRectangle.Top - Layer.Bounds.Top, - artemisLed.AbsoluteRenderRectangle.Width, - artemisLed.AbsoluteRenderRectangle.Height + artemisLed.AbsoluteRectangle.Left - Layer.Bounds.Left, + artemisLed.AbsoluteRectangle.Top - Layer.Bounds.Top, + artemisLed.AbsoluteRectangle.Width, + artemisLed.AbsoluteRectangle.Height ); canvas.DrawRect(ledRectangle, ledPaint); diff --git a/src/Artemis.Core/Services/CoreService.cs b/src/Artemis.Core/Services/CoreService.cs index a0877da5f..42cb4f07d 100644 --- a/src/Artemis.Core/Services/CoreService.cs +++ b/src/Artemis.Core/Services/CoreService.cs @@ -27,13 +27,14 @@ namespace Artemis.Core.Services private readonly Stopwatch _frameStopWatch; private readonly ILogger _logger; private readonly PluginSetting _loggingLevel; + private readonly PluginSetting _renderScale; private readonly IPluginManagementService _pluginManagementService; private readonly IProfileService _profileService; private readonly IRgbService _rgbService; private readonly ISurfaceService _surfaceService; private List _dataModelExpansions = new List(); private List _modules = new List(); - + // ReSharper disable UnusedParameter.Local - Storage migration and module service are injected early to ensure it runs before anything else public CoreService(IKernel kernel, ILogger logger, StorageMigrationService _, ISettingsService settingsService, IPluginManagementService pluginManagementService, IRgbService rgbService, ISurfaceService surfaceService, IProfileService profileService, IModuleService moduleService) @@ -47,6 +48,7 @@ namespace Artemis.Core.Services _surfaceService = surfaceService; _profileService = profileService; _loggingLevel = settingsService.GetSetting("Core.LoggingLevel", LogEventLevel.Debug); + _renderScale = settingsService.GetSetting("Core.RenderScale", 0.5); _frameStopWatch = new Stopwatch(); UpdatePluginCache(); @@ -185,6 +187,7 @@ namespace Artemis.Core.Services // Render all active modules using SKCanvas canvas = new SKCanvas(_rgbService.BitmapBrush.Bitmap); + canvas.Scale((float) _renderScale.Value); canvas.Clear(new SKColor(0, 0, 0)); if (!ModuleRenderingDisabled) // While non-activated modules may be updated above if they expand the main data model, they may never render diff --git a/src/Artemis.Core/Services/Storage/Models/SurfaceArrangementConfiguration.cs b/src/Artemis.Core/Services/Storage/Models/SurfaceArrangementConfiguration.cs index 2cc897ff1..fb346fa21 100644 --- a/src/Artemis.Core/Services/Storage/Models/SurfaceArrangementConfiguration.cs +++ b/src/Artemis.Core/Services/Storage/Models/SurfaceArrangementConfiguration.cs @@ -17,6 +17,8 @@ namespace Artemis.Core.Services.Models MarginTop = margin; MarginRight = margin; MarginBottom = margin; + + SurfaceArrangement = null!; } diff --git a/src/Artemis.Core/Services/Storage/SurfaceService.cs b/src/Artemis.Core/Services/Storage/SurfaceService.cs index 21eab6998..829d04424 100644 --- a/src/Artemis.Core/Services/Storage/SurfaceService.cs +++ b/src/Artemis.Core/Services/Storage/SurfaceService.cs @@ -15,26 +15,23 @@ namespace Artemis.Core.Services { private readonly ILogger _logger; private readonly IPluginManagementService _pluginManagementService; - private readonly PluginSetting _renderScaleSetting; private readonly IRgbService _rgbService; private readonly List _surfaceConfigurations; private readonly ISurfaceRepository _surfaceRepository; - public SurfaceService(ILogger logger, ISurfaceRepository surfaceRepository, IRgbService rgbService, IPluginManagementService pluginManagementService, ISettingsService settingsService) + public SurfaceService(ILogger logger, ISurfaceRepository surfaceRepository, IRgbService rgbService, IPluginManagementService pluginManagementService) { _logger = logger; _surfaceRepository = surfaceRepository; _rgbService = rgbService; _pluginManagementService = pluginManagementService; _surfaceConfigurations = new List(); - _renderScaleSetting = settingsService.GetSetting("Core.RenderScale", 0.5); // LoadFromRepository is guaranteed to set the ActiveSurface ActiveSurface = null!; LoadFromRepository(); _rgbService.DeviceLoaded += RgbServiceOnDeviceLoaded; - _renderScaleSetting.SettingChanged += RenderScaleSettingOnSettingChanged; } public ArtemisSurface ActiveSurface { get; private set; } @@ -43,7 +40,7 @@ namespace Artemis.Core.Services public ArtemisSurface CreateSurfaceConfiguration(string name) { // Create a blank config - ArtemisSurface configuration = new ArtemisSurface(_rgbService.Surface, name, _renderScaleSetting.Value); + ArtemisSurface configuration = new ArtemisSurface(_rgbService.Surface, name); // Add all current devices foreach (IRGBDevice rgbDevice in _rgbService.LoadedDevices) @@ -133,7 +130,7 @@ namespace Artemis.Core.Services foreach (SurfaceEntity surfaceEntity in configs) { // Create the surface entity - ArtemisSurface surfaceConfiguration = new ArtemisSurface(_rgbService.Surface, surfaceEntity, _renderScaleSetting.Value); + ArtemisSurface surfaceConfiguration = new ArtemisSurface(_rgbService.Surface, surfaceEntity); foreach (DeviceEntity position in surfaceEntity.DeviceEntities) { IRGBDevice? device = _rgbService.Surface.Devices.FirstOrDefault(d => d.GetDeviceIdentifier() == position.DeviceIdentifier); @@ -225,15 +222,6 @@ namespace Artemis.Core.Services UpdateSurfaceConfiguration(ActiveSurface, true); } - private void RenderScaleSettingOnSettingChanged(object? sender, EventArgs e) - { - foreach (ArtemisSurface surfaceConfiguration in SurfaceConfigurations) - { - surfaceConfiguration.UpdateScale(_renderScaleSetting.Value); - OnSurfaceConfigurationUpdated(new SurfaceConfigurationEventArgs(surfaceConfiguration)); - } - } - #endregion #region Events diff --git a/src/Artemis.UI/Services/LayerEditorService.cs b/src/Artemis.UI/Services/LayerEditorService.cs index 720c9f719..52b12adde 100644 --- a/src/Artemis.UI/Services/LayerEditorService.cs +++ b/src/Artemis.UI/Services/LayerEditorService.cs @@ -22,12 +22,11 @@ namespace Artemis.UI.Services public Rect GetLayerBounds(Layer layer) { // Adjust the render rectangle for the difference in render scale - double renderScale = _settingsService.GetSetting("Core.RenderScale", 0.5).Value; return new Rect( - layer.Bounds.Left / renderScale * 1, - layer.Bounds.Top / renderScale * 1, - Math.Max(0, layer.Bounds.Width / renderScale * 1), - Math.Max(0, layer.Bounds.Height / renderScale * 1) + layer.Bounds.Left, + layer.Bounds.Top, + Math.Max(0, layer.Bounds.Width), + Math.Max(0, layer.Bounds.Height) ); }