From 48fb3880b976a8f89125d975cd8b1067cf04d4a7 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Thu, 11 Aug 2016 12:29:13 +1000 Subject: [PATCH] Sanitize ColorMatrix filters Former-commit-id: b26dae4a4bbe620476ad334e7e4b6eb9eb2d4625 Former-commit-id: 3a71a08ef4665c7b677153c7df2e9c41926e0b10 Former-commit-id: 1a1eec21f2fe5e15cac7afd8f9c441d7d207ce01 --- .../ColorMatrix/ColorMatrixFilter.cs | 41 ++++++++++++++----- .../ColorMatrix/LomographProcessor.cs | 2 +- .../ColorMatrix/PolaroidProcessor.cs | 4 +- .../Processors/Filters/LomographTest.cs | 24 +++++++++++ 4 files changed, 58 insertions(+), 13 deletions(-) diff --git a/src/ImageProcessorCore/Filters/Processors/ColorMatrix/ColorMatrixFilter.cs b/src/ImageProcessorCore/Filters/Processors/ColorMatrix/ColorMatrixFilter.cs index 67571471c8..cbe1d0a3f6 100644 --- a/src/ImageProcessorCore/Filters/Processors/ColorMatrix/ColorMatrixFilter.cs +++ b/src/ImageProcessorCore/Filters/Processors/ColorMatrix/ColorMatrixFilter.cs @@ -5,6 +5,7 @@ namespace ImageProcessorCore.Processors { + using System; using System.Numerics; using System.Threading.Tasks; @@ -28,6 +29,24 @@ namespace ImageProcessorCore.Processors { int startX = sourceRectangle.X; int endX = sourceRectangle.Right; + + // Align start/end positions. + int minX = Math.Max(0, startX); + int maxX = Math.Min(source.Width, endX); + int minY = Math.Max(0, startY); + int maxY = Math.Min(source.Height, endY); + + // Reset offset if necessary. + if (minX > 0) + { + startX = 0; + } + + if (minY > 0) + { + startY = 0; + } + Matrix4x4 matrix = this.Matrix; bool compand = this.Compand; @@ -35,18 +54,20 @@ namespace ImageProcessorCore.Processors using (IPixelAccessor targetPixels = target.Lock()) { Parallel.For( - startY, - endY, - this.ParallelOptions, - y => - { - for (int x = startX; x < endX; x++) + minY, + maxY, + this.ParallelOptions, + y => { - targetPixels[x, y] = this.ApplyMatrix(sourcePixels[x, y], matrix, compand); - } + int offsetY = y - startY; + for (int x = minX; x < maxX; x++) + { + int offsetX = x - startX; + targetPixels[offsetX, offsetY] = this.ApplyMatrix(sourcePixels[offsetX, offsetY], matrix, compand); + } - this.OnRowProcessed(); - }); + this.OnRowProcessed(); + }); } } diff --git a/src/ImageProcessorCore/Filters/Processors/ColorMatrix/LomographProcessor.cs b/src/ImageProcessorCore/Filters/Processors/ColorMatrix/LomographProcessor.cs index 173ec1a81c..7346e7b80a 100644 --- a/src/ImageProcessorCore/Filters/Processors/ColorMatrix/LomographProcessor.cs +++ b/src/ImageProcessorCore/Filters/Processors/ColorMatrix/LomographProcessor.cs @@ -32,7 +32,7 @@ namespace ImageProcessorCore.Processors { T packed = default(T); packed.PackFromBytes(0, 10, 0, 255); // Very dark (mostly black) lime green. - new VignetteProcessor { VignetteColor = packed }.Apply(target, target, targetRectangle); + new VignetteProcessor { VignetteColor = packed }.Apply(target, target, sourceRectangle); } } } diff --git a/src/ImageProcessorCore/Filters/Processors/ColorMatrix/PolaroidProcessor.cs b/src/ImageProcessorCore/Filters/Processors/ColorMatrix/PolaroidProcessor.cs index 689861f73a..ebcf722b28 100644 --- a/src/ImageProcessorCore/Filters/Processors/ColorMatrix/PolaroidProcessor.cs +++ b/src/ImageProcessorCore/Filters/Processors/ColorMatrix/PolaroidProcessor.cs @@ -38,11 +38,11 @@ namespace ImageProcessorCore.Processors { T packedV = default(T); packedV.PackFromBytes(102, 34, 0, 255); // Very dark orange [Brown tone] - new VignetteProcessor { VignetteColor = packedV }.Apply(target, target, targetRectangle); + new VignetteProcessor { VignetteColor = packedV }.Apply(target, target, sourceRectangle); T packedG = default(T); packedG.PackFromBytes(255, 153, 102, 178); // Light orange - new GlowProcessor { GlowColor = packedG, Radius = target.Width / 4F }.Apply(target, target, targetRectangle); + new GlowProcessor { GlowColor = packedG, Radius = target.Width / 4F }.Apply(target, target, sourceRectangle); } } } diff --git a/tests/ImageProcessorCore.Tests/Processors/Filters/LomographTest.cs b/tests/ImageProcessorCore.Tests/Processors/Filters/LomographTest.cs index e125bd8efd..71fc4a161f 100644 --- a/tests/ImageProcessorCore.Tests/Processors/Filters/LomographTest.cs +++ b/tests/ImageProcessorCore.Tests/Processors/Filters/LomographTest.cs @@ -34,5 +34,29 @@ namespace ImageProcessorCore.Tests } } } + + [Fact] + public void ImageShouldApplyLomographFilterInBox() + { + const string path = "TestOutput/Lomograph"; + if (!Directory.Exists(path)) + { + Directory.CreateDirectory(path); + } + + foreach (string file in Files) + { + using (FileStream stream = File.OpenRead(file)) + { + string filename = Path.GetFileNameWithoutExtension(file) + "-InBox" + Path.GetExtension(file); + Image image = new Image(stream); + using (FileStream output = File.OpenWrite($"{path}/{filename}")) + { + image.Lomograph(new Rectangle(image.Width / 4, image.Width / 4, image.Width / 2, image.Height / 2)) + .Save(output); + } + } + } + } } } \ No newline at end of file