Browse Source

Cache some variables

pull/2060/head
Ynse Hoornenborg 5 years ago
parent
commit
f336b80160
  1. 2
      src/ImageSharp/Processing/Processors/Convolution/BorderWrappingMode.cs
  2. 12
      src/ImageSharp/Processing/Processors/Convolution/KernelSamplingMap.cs

2
src/ImageSharp/Processing/Processors/Convolution/BorderWrappingMode.cs

@ -15,7 +15,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
Wrap = 1, Wrap = 1,
/// <summary>Mirror the last few border values: fedcb|abcdefgh|gfedcb</summary> /// <summary>Mirror the last few border values: fedcb|abcdefgh|gfedcb</summary>
/// <remarks>Please note this mode doe not repeat the very border pixel, as this gives better image quality.</remarks> /// <remarks>Please note this mode does not repeat the very border pixel, as this gives better image quality.</remarks>
Mirror = 2 Mirror = 2
} }
} }

12
src/ImageSharp/Processing/Processors/Convolution/KernelSamplingMap.cs

@ -104,6 +104,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
private void CorrectBorder(Span<int> span, int kernelSize, int min, int max, BorderWrappingMode borderMode) private void CorrectBorder(Span<int> span, int kernelSize, int min, int max, BorderWrappingMode borderMode)
{ {
var affectedSize = (kernelSize >> 1) * kernelSize; var affectedSize = (kernelSize >> 1) * kernelSize;
ref int spanBase = ref MemoryMarshal.GetReference(span);
if (affectedSize > 0) if (affectedSize > 0)
{ {
switch (borderMode) switch (borderMode)
@ -113,32 +114,35 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
Numerics.Clamp(span.Slice(span.Length - affectedSize), min, max); Numerics.Clamp(span.Slice(span.Length - affectedSize), min, max);
break; break;
case BorderWrappingMode.Mirror: case BorderWrappingMode.Mirror:
var min2 = min + min;
for (int i = 0; i < affectedSize; i++) for (int i = 0; i < affectedSize; i++)
{ {
var value = span[i]; var value = span[i];
if (value < min) 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++) for (int i = span.Length - affectedSize; i < span.Length; i++)
{ {
var value = span[i]; var value = span[i];
if (value > max) if (value > max)
{ {
span[i] = max - value + max; span[i] = max2 - value;
} }
} }
break; break;
case BorderWrappingMode.Wrap: case BorderWrappingMode.Wrap:
var diff = max - min + 1;
for (int i = 0; i < affectedSize; i++) for (int i = 0; i < affectedSize; i++)
{ {
var value = span[i]; var value = span[i];
if (value < min) 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]; var value = span[i];
if (value > max) if (value > max)
{ {
span[i] = min + value - max - 1; span[i] = value - diff;
} }
} }

Loading…
Cancel
Save