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)
);
}