From 943907776940be5e7c43b83a82dbdd08a4a8bc2d Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Wed, 24 May 2017 13:58:10 +1000 Subject: [PATCH] Optimize Alpha --- .../Processors/Effects/AlphaProcessor.cs | 32 ++++++++----------- .../Processors/Filters/AlphaTest.cs | 4 +-- 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/src/ImageSharp/Processing/Processors/Effects/AlphaProcessor.cs b/src/ImageSharp/Processing/Processors/Effects/AlphaProcessor.cs index 5e7310e32..a3894f8d3 100644 --- a/src/ImageSharp/Processing/Processors/Effects/AlphaProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Effects/AlphaProcessor.cs @@ -61,26 +61,22 @@ namespace ImageSharp.Processing.Processors startY = 0; } - Vector4 alphaVector = new Vector4(1, 1, 1, this.Value); + var alphaVector = new Vector4(1, 1, 1, this.Value); - using (PixelAccessor sourcePixels = source.Lock()) - { - Parallel.For( - minY, - maxY, - this.ParallelOptions, - y => + Parallel.For( + minY, + maxY, + this.ParallelOptions, + y => + { + Span row = source.GetRowSpan(y - startY); + + for (int x = minX; x < maxX; x++) { - int offsetY = y - startY; - for (int x = minX; x < maxX; x++) - { - int offsetX = x - startX; - TPixel packed = default(TPixel); - packed.PackFromVector4(sourcePixels[offsetX, offsetY].ToVector4() * alphaVector); - sourcePixels[offsetX, offsetY] = packed; - } - }); - } + ref TPixel pixel = ref row[x - startX]; + pixel.PackFromVector4(pixel.ToVector4() * alphaVector); + } + }); } } } diff --git a/tests/ImageSharp.Tests/Processors/Filters/AlphaTest.cs b/tests/ImageSharp.Tests/Processors/Filters/AlphaTest.cs index e40e3a205..401ac916b 100644 --- a/tests/ImageSharp.Tests/Processors/Filters/AlphaTest.cs +++ b/tests/ImageSharp.Tests/Processors/Filters/AlphaTest.cs @@ -22,7 +22,7 @@ namespace ImageSharp.Tests [Theory] [MemberData(nameof(AlphaValues))] - public void ImageShouldApplyAlphaFilter(int value) + public void ImageShouldApplyAlphaFilter(float value) { string path = this.CreateOutputDirectory("Alpha"); @@ -39,7 +39,7 @@ namespace ImageSharp.Tests [Theory] [MemberData(nameof(AlphaValues))] - public void ImageShouldApplyAlphaFilterInBox(int value) + public void ImageShouldApplyAlphaFilterInBox(float value) { string path = this.CreateOutputDirectory("Alpha");