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 + } +}