diff --git a/src/ImageSharp/Processing/Processors/Convolution/BorderWrappingMode.cs b/src/ImageSharp/Processing/Processors/Convolution/BorderWrappingMode.cs index 0dd5e59439..1fd1020cc8 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/BorderWrappingMode.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/BorderWrappingMode.cs @@ -15,7 +15,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution Wrap = 1, /// Mirror the last few border values: fedcb|abcdefgh|gfedcb - /// Please note this mode doe not repeat the very border pixel, as this gives better image quality. + /// Please note this mode does not repeat the very border pixel, as this gives better image quality. Mirror = 2 } } diff --git a/src/ImageSharp/Processing/Processors/Convolution/KernelSamplingMap.cs b/src/ImageSharp/Processing/Processors/Convolution/KernelSamplingMap.cs index 5c0a25befa..fde8bae3cb 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/KernelSamplingMap.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/KernelSamplingMap.cs @@ -104,6 +104,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution private void CorrectBorder(Span span, int kernelSize, int min, int max, BorderWrappingMode borderMode) { var affectedSize = (kernelSize >> 1) * kernelSize; + ref int spanBase = ref MemoryMarshal.GetReference(span); if (affectedSize > 0) { switch (borderMode) @@ -113,32 +114,35 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution Numerics.Clamp(span.Slice(span.Length - affectedSize), min, max); break; case BorderWrappingMode.Mirror: + var min2 = min + min; for (int i = 0; i < affectedSize; i++) { var value = span[i]; if (value < min) { - span[i] = min - value + min; + span[i] = min2 - value; } } + var max2 = max + max; for (int i = span.Length - affectedSize; i < span.Length; i++) { var value = span[i]; if (value > max) { - span[i] = max - value + max; + span[i] = max2 - value; } } break; case BorderWrappingMode.Wrap: + var diff = max - min + 1; for (int i = 0; i < affectedSize; i++) { var value = span[i]; if (value < min) { - span[i] = max - min + value + 1; + span[i] = diff + value; } } @@ -147,7 +151,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution var value = span[i]; if (value > max) { - span[i] = min + value - max - 1; + span[i] = value - diff; } }