diff --git a/src/ImageSharp/Processing/Processors/Transforms/ResamplingWeightedProcessor.Weights.cs b/src/ImageSharp/Processing/Processors/Transforms/ResamplingWeightedProcessor.Weights.cs
index b5266c9bd8..8aef87ec85 100644
--- a/src/ImageSharp/Processing/Processors/Transforms/ResamplingWeightedProcessor.Weights.cs
+++ b/src/ImageSharp/Processing/Processors/Transforms/ResamplingWeightedProcessor.Weights.cs
@@ -27,31 +27,52 @@ namespace ImageSharp.Processing.Processors
public int Left;
///
- /// The span of weights pointing to .
+ /// The length of the weights window
///
- public Span Span;
+ public int Length;
+
+ ///
+ /// The index in the destination buffer
+ ///
+ private readonly int flatStartIndex;
+
+ ///
+ /// The buffer containing the weights values.
+ ///
+ private readonly Buffer buffer;
///
/// Initializes a new instance of the struct.
///
+ /// The destination index in the buffer
/// The local left index
- /// The span
+ /// The span
+ /// The length of the window
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- internal WeightsWindow(int left, Span span)
+ internal WeightsWindow(int index, int left, Buffer2D buffer, int length)
{
+ this.flatStartIndex = (index * buffer.Width) + left;
this.Left = left;
- this.Span = span;
+ this.buffer = buffer;
+ this.Length = length;
}
///
- /// Gets an unsafe float* pointer to the beginning of .
+ /// Gets a reference to the first item of the window.
///
- public ref float Ptr => ref this.Span.DangerousGetPinnableReference();
+ /// The reference to the first item of the window
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public ref float GetStartReference()
+ {
+ return ref this.buffer[this.flatStartIndex];
+ }
///
- /// Gets the lenghth of the weights window
+ /// Gets the span representing the portion of the that this window covers
///
- public int Length => this.Span.Length;
+ /// The
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public Span GetWindowSpan() => this.buffer.Slice(this.flatStartIndex, this.Length);
///
/// Computes the sum of vectors in 'rowSpan' weighted by weight values, pointed by this instance.
@@ -62,7 +83,7 @@ namespace ImageSharp.Processing.Processors
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ComputeWeightedRowSum(Span rowSpan, int sourceX)
{
- ref float horizontalValues = ref this.Ptr;
+ ref float horizontalValues = ref this.GetStartReference();
int left = this.Left;
ref Vector4 vecPtr = ref Unsafe.Add(ref rowSpan.DangerousGetPinnableReference(), left + sourceX);
@@ -89,7 +110,7 @@ namespace ImageSharp.Processing.Processors
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ComputeExpandedWeightedRowSum(Span rowSpan, int sourceX)
{
- ref float horizontalValues = ref this.Ptr;
+ ref float horizontalValues = ref this.GetStartReference();
int left = this.Left;
ref Vector4 vecPtr = ref Unsafe.Add(ref rowSpan.DangerousGetPinnableReference(), left + sourceX);
@@ -117,7 +138,7 @@ namespace ImageSharp.Processing.Processors
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ComputeWeightedColumnSum(Buffer2D firstPassPixels, int x, int sourceY)
{
- ref float verticalValues = ref this.Ptr;
+ ref float verticalValues = ref this.GetStartReference();
int left = this.Left;
// Destination color components
@@ -139,7 +160,7 @@ namespace ImageSharp.Processing.Processors
///
internal class WeightsBuffer : IDisposable
{
- private Buffer2D dataBuffer;
+ private readonly Buffer2D dataBuffer;
///
/// Initializes a new instance of the class.
@@ -174,8 +195,7 @@ namespace ImageSharp.Processing.Processors
/// The weights
public WeightsWindow GetWeightsWindow(int destIdx, int leftIdx, int rightIdx)
{
- Span span = this.dataBuffer.GetRowSpan(destIdx).Slice(leftIdx, rightIdx - leftIdx + 1);
- return new WeightsWindow(leftIdx, span);
+ return new WeightsWindow(destIdx, leftIdx, this.dataBuffer, rightIdx - leftIdx + 1);
}
}
}
diff --git a/src/ImageSharp/Processing/Processors/Transforms/ResamplingWeightedProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/ResamplingWeightedProcessor.cs
index 757b0889a5..7245b961f8 100644
--- a/src/ImageSharp/Processing/Processors/Transforms/ResamplingWeightedProcessor.cs
+++ b/src/ImageSharp/Processing/Processors/Transforms/ResamplingWeightedProcessor.cs
@@ -112,7 +112,7 @@ namespace ImageSharp.Processing.Processors
WeightsWindow ws = result.GetWeightsWindow(i, left, right);
result.Weights[i] = ws;
- ref float weights = ref ws.Ptr;
+ ref float weightsBaseRef = ref ws.GetStartReference();
for (int j = left; j <= right; j++)
{
@@ -120,7 +120,7 @@ namespace ImageSharp.Processing.Processors
sum += weight;
// weights[j - left] = weight:
- Unsafe.Add(ref weights, j - left) = weight;
+ Unsafe.Add(ref weightsBaseRef, j - left) = weight;
}
// Normalise, best to do it here rather than in the pixel loop later on.
@@ -129,7 +129,7 @@ namespace ImageSharp.Processing.Processors
for (int w = 0; w < ws.Length; w++)
{
// weights[w] = weights[w] / sum:
- ref float wRef = ref Unsafe.Add(ref weights, w);
+ ref float wRef = ref Unsafe.Add(ref weightsBaseRef, w);
wRef = wRef / sum;
}
}
diff --git a/tests/ImageSharp.Tests/Processing/Transforms/ResizeProfilingBenchmarks.cs b/tests/ImageSharp.Tests/Processing/Transforms/ResizeProfilingBenchmarks.cs
index 3f8a75b92b..8b57586f49 100644
--- a/tests/ImageSharp.Tests/Processing/Transforms/ResizeProfilingBenchmarks.cs
+++ b/tests/ImageSharp.Tests/Processing/Transforms/ResizeProfilingBenchmarks.cs
@@ -5,6 +5,7 @@
namespace ImageSharp.Tests.Processing.Transforms
{
+ using System;
using System.IO;
using System.Text;
@@ -49,9 +50,10 @@ namespace ImageSharp.Tests.Processing.Transforms
foreach (ResamplingWeightedProcessor.WeightsWindow window in weights.Weights)
{
+ Span span = window.GetWindowSpan();
for (int i = 0; i < window.Length; i++)
{
- float value = window.Span[i];
+ float value = span[i];
bld.Append(value);
bld.Append("| ");
}