diff --git a/Artemis/Artemis/Artemis.csproj b/Artemis/Artemis/Artemis.csproj
index 985856c87..2578762e6 100644
--- a/Artemis/Artemis/Artemis.csproj
+++ b/Artemis/Artemis/Artemis.csproj
@@ -413,6 +413,7 @@
+
diff --git a/Artemis/Artemis/Profiles/Layers/Types/AmbientLight/AmbienceCreator/AmbienceCreatorMirror.cs b/Artemis/Artemis/Profiles/Layers/Types/AmbientLight/AmbienceCreator/AmbienceCreatorMirror.cs
index da10a29e0..c096664d4 100644
--- a/Artemis/Artemis/Profiles/Layers/Types/AmbientLight/AmbienceCreator/AmbienceCreatorMirror.cs
+++ b/Artemis/Artemis/Profiles/Layers/Types/AmbientLight/AmbienceCreator/AmbienceCreatorMirror.cs
@@ -32,7 +32,7 @@ namespace Artemis.Profiles.Layers.Types.AmbientLight.AmbienceCreator
int effectiveSourceWidth = sourceWidth - offsetLeft - offsetRight;
int effectiveSourceHeight = sourceHeight - offsetTop - offsetBottom;
- int relevantSourceHeight = (int)Math.Round(effectiveSourceHeight * settings.MirroredAmount);
+ int relevantSourceHeight = (int)Math.Round(effectiveSourceHeight * (settings.MirroredAmount / 100.0));
int relevantOffsetTop = sourceHeight - offsetBottom - relevantSourceHeight;
double widthPixels = effectiveSourceWidth / (double)targetWidth;
diff --git a/Artemis/Artemis/Profiles/Layers/Types/AmbientLight/AmbientLightPropertiesModel.cs b/Artemis/Artemis/Profiles/Layers/Types/AmbientLight/AmbientLightPropertiesModel.cs
index a741e05d9..26d1ab785 100644
--- a/Artemis/Artemis/Profiles/Layers/Types/AmbientLight/AmbientLightPropertiesModel.cs
+++ b/Artemis/Artemis/Profiles/Layers/Types/AmbientLight/AmbientLightPropertiesModel.cs
@@ -18,8 +18,9 @@ namespace Artemis.Profiles.Layers.Types.AmbientLight
public int OffsetTop { get; set; } = 0;
public int OffsetBottom { get; set; } = 0;
- public double MirroredAmount { get; set; } = 0.1;
+ public double MirroredAmount { get; set; } = 10;
+ public SmoothMode SmoothMode { get; set; } = SmoothMode.Low;
public BlackBarDetectionMode BlackBarDetectionMode { get; set; } = BlackBarDetectionMode.Bottom;
public FlipMode FlipMode { get; set; } = FlipMode.Vertical;
diff --git a/Artemis/Artemis/Profiles/Layers/Types/AmbientLight/AmbientLightType.cs b/Artemis/Artemis/Profiles/Layers/Types/AmbientLight/AmbientLightType.cs
index 0d09fa58f..138f2c02a 100644
--- a/Artemis/Artemis/Profiles/Layers/Types/AmbientLight/AmbientLightType.cs
+++ b/Artemis/Artemis/Profiles/Layers/Types/AmbientLight/AmbientLightType.cs
@@ -7,6 +7,7 @@ using Artemis.Profiles.Layers.Abstract;
using Artemis.Profiles.Layers.Interfaces;
using Artemis.Profiles.Layers.Models;
using Artemis.Profiles.Layers.Types.AmbientLight.AmbienceCreator;
+using Artemis.Profiles.Layers.Types.AmbientLight.Model.Extensions;
using Artemis.Profiles.Layers.Types.AmbientLight.ScreenCapturing;
using Artemis.ViewModels.Profiles;
using Newtonsoft.Json;
@@ -56,8 +57,9 @@ namespace Artemis.Profiles.Layers.Types.AmbientLight
int height = (int)Math.Round(properties.Height);
byte[] data = ScreenCaptureManager.GetLastScreenCapture();
- _lastData = GetAmbienceCreator().GetAmbience(data, ScreenCaptureManager.LastCaptureWidth, ScreenCaptureManager.LastCaptureHeight, width, height, properties);
+ byte[] newData = GetAmbienceCreator().GetAmbience(data, ScreenCaptureManager.LastCaptureWidth, ScreenCaptureManager.LastCaptureHeight, width, height, properties);
+ _lastData = _lastData?.Blend(newData, properties.SmoothMode) ?? newData;
int stride = (width * ScreenCaptureManager.LastCapturePixelFormat.BitsPerPixel + 7) / 8;
properties.AmbientLightBrush = new DrawingBrush(new ImageDrawing
(BitmapSource.Create(width, height, 96, 96, ScreenCaptureManager.LastCapturePixelFormat, null, _lastData, stride), new Rect(0, 0, width, height)));
diff --git a/Artemis/Artemis/Profiles/Layers/Types/AmbientLight/Model/Extensions/PixelDataExtension.cs b/Artemis/Artemis/Profiles/Layers/Types/AmbientLight/Model/Extensions/PixelDataExtension.cs
index cd1fbf690..41a6d0457 100644
--- a/Artemis/Artemis/Profiles/Layers/Types/AmbientLight/Model/Extensions/PixelDataExtension.cs
+++ b/Artemis/Artemis/Profiles/Layers/Types/AmbientLight/Model/Extensions/PixelDataExtension.cs
@@ -1,4 +1,6 @@
-namespace Artemis.Profiles.Layers.Types.AmbientLight.Model.Extensions
+using System;
+
+namespace Artemis.Profiles.Layers.Types.AmbientLight.Model.Extensions
{
public static class PixelDataExtension
{
@@ -81,5 +83,25 @@
return height;
}
+
+ public static byte[] Blend(this byte[] pixels, byte[] blendPixels, SmoothMode smoothMode)
+ {
+ if (smoothMode == SmoothMode.None || pixels.Length != blendPixels.Length) return blendPixels;
+
+ double percentage = smoothMode == SmoothMode.Low? 0.25: (smoothMode == SmoothMode.Medium ? 0.075 : 0.025 /*high*/);
+
+ byte[] blended = new byte[pixels.Length];
+
+ for (int i = 0; i < blended.Length; i++)
+ blended[i] = GetIntColor((blendPixels[i] / 255.0) * percentage + (pixels[i] / 255.0) * (1 - percentage));
+
+ return blended;
+ }
+
+ private static byte GetIntColor(double d)
+ {
+ double calcF = Math.Max(0, Math.Min(1, d));
+ return (byte)(calcF.Equals(1) ? 255 : calcF * 256);
+ }
}
}
diff --git a/Artemis/Artemis/Profiles/Layers/Types/AmbientLight/Model/SmoothMode.cs b/Artemis/Artemis/Profiles/Layers/Types/AmbientLight/Model/SmoothMode.cs
new file mode 100644
index 000000000..d32edbd43
--- /dev/null
+++ b/Artemis/Artemis/Profiles/Layers/Types/AmbientLight/Model/SmoothMode.cs
@@ -0,0 +1,10 @@
+namespace Artemis.Profiles.Layers.Types.AmbientLight.Model
+{
+ public enum SmoothMode
+ {
+ None,
+ Low,
+ Medium,
+ High
+ }
+}