Browse Source

replaced WeightsWindow.destIndex with flatStartIndex

af/merge-core
Anton Firszov 9 years ago
parent
commit
2d0bdfd97a
  1. 27
      src/ImageSharp/Processing/Processors/Transforms/ResamplingWeightedProcessor.Weights.cs
  2. 6
      src/ImageSharp/Processing/Processors/Transforms/ResamplingWeightedProcessor.cs

27
src/ImageSharp/Processing/Processors/Transforms/ResamplingWeightedProcessor.Weights.cs

@ -34,12 +34,12 @@ namespace ImageSharp.Processing.Processors
/// <summary> /// <summary>
/// The index in the destination buffer /// The index in the destination buffer
/// </summary> /// </summary>
private readonly int destIndex; private readonly int flatStartIndex;
/// <summary> /// <summary>
/// The weights buffer <see cref="WeightsBuffer"/>. /// The buffer containing the weights values.
/// </summary> /// </summary>
private readonly Buffer2D<float> buffer; private readonly Buffer<float> buffer;
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="WeightsWindow"/> struct. /// Initializes a new instance of the <see cref="WeightsWindow"/> struct.
@ -51,22 +51,19 @@ namespace ImageSharp.Processing.Processors
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
internal WeightsWindow(int index, int left, Buffer2D<float> buffer, int length) internal WeightsWindow(int index, int left, Buffer2D<float> buffer, int length)
{ {
this.destIndex = index; this.flatStartIndex = (index * buffer.Width) + left;
this.Left = left; this.Left = left;
this.buffer = buffer; this.buffer = buffer;
this.Length = length; this.Length = length;
} }
/// <summary> /// <summary>
/// Gets an unsafe float* pointer to the beginning of <see cref="buffer"/>. /// Gets a reference to the first item of the window.
/// </summary> /// </summary>
public ref float Ptr /// <returns>The reference to the first item of the window</returns>
public ref float GetStartReference()
{ {
[MethodImpl(MethodImplOptions.AggressiveInlining)] return ref this.buffer[this.flatStartIndex];
get
{
return ref this.GetWindowSpan().DangerousGetPinnableReference();
}
} }
/// <summary> /// <summary>
@ -74,7 +71,7 @@ namespace ImageSharp.Processing.Processors
/// </summary> /// </summary>
/// <returns>The <see cref="Span{T}"/></returns> /// <returns>The <see cref="Span{T}"/></returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public Span<float> GetWindowSpan() => this.buffer.GetRowSpan(this.destIndex).Slice(this.Left, this.Length); public Span<float> GetWindowSpan() => this.buffer.Slice(this.flatStartIndex, this.Length);
/// <summary> /// <summary>
/// Computes the sum of vectors in 'rowSpan' weighted by weight values, pointed by this <see cref="WeightsWindow"/> instance. /// Computes the sum of vectors in 'rowSpan' weighted by weight values, pointed by this <see cref="WeightsWindow"/> instance.
@ -85,7 +82,7 @@ namespace ImageSharp.Processing.Processors
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ComputeWeightedRowSum(Span<Vector4> rowSpan, int sourceX) public Vector4 ComputeWeightedRowSum(Span<Vector4> rowSpan, int sourceX)
{ {
ref float horizontalValues = ref this.Ptr; ref float horizontalValues = ref this.GetStartReference();
int left = this.Left; int left = this.Left;
ref Vector4 vecPtr = ref Unsafe.Add(ref rowSpan.DangerousGetPinnableReference(), left + sourceX); ref Vector4 vecPtr = ref Unsafe.Add(ref rowSpan.DangerousGetPinnableReference(), left + sourceX);
@ -112,7 +109,7 @@ namespace ImageSharp.Processing.Processors
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ComputeExpandedWeightedRowSum(Span<Vector4> rowSpan, int sourceX) public Vector4 ComputeExpandedWeightedRowSum(Span<Vector4> rowSpan, int sourceX)
{ {
ref float horizontalValues = ref this.Ptr; ref float horizontalValues = ref this.GetStartReference();
int left = this.Left; int left = this.Left;
ref Vector4 vecPtr = ref Unsafe.Add(ref rowSpan.DangerousGetPinnableReference(), left + sourceX); ref Vector4 vecPtr = ref Unsafe.Add(ref rowSpan.DangerousGetPinnableReference(), left + sourceX);
@ -140,7 +137,7 @@ namespace ImageSharp.Processing.Processors
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ComputeWeightedColumnSum(Buffer2D<Vector4> firstPassPixels, int x, int sourceY) public Vector4 ComputeWeightedColumnSum(Buffer2D<Vector4> firstPassPixels, int x, int sourceY)
{ {
ref float verticalValues = ref this.Ptr; ref float verticalValues = ref this.GetStartReference();
int left = this.Left; int left = this.Left;
// Destination color components // Destination color components

6
src/ImageSharp/Processing/Processors/Transforms/ResamplingWeightedProcessor.cs

@ -112,7 +112,7 @@ namespace ImageSharp.Processing.Processors
WeightsWindow ws = result.GetWeightsWindow(i, left, right); WeightsWindow ws = result.GetWeightsWindow(i, left, right);
result.Weights[i] = ws; result.Weights[i] = ws;
ref float weights = ref ws.Ptr; ref float weightsBaseRef = ref ws.GetStartReference();
for (int j = left; j <= right; j++) for (int j = left; j <= right; j++)
{ {
@ -120,7 +120,7 @@ namespace ImageSharp.Processing.Processors
sum += weight; sum += weight;
// weights[j - left] = 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. // 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++) for (int w = 0; w < ws.Length; w++)
{ {
// weights[w] = weights[w] / sum: // 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; wRef = wRef / sum;
} }
} }

Loading…
Cancel
Save