Browse Source

First attempt

af/merge-core
James Jackson-South 9 years ago
parent
commit
ae1e2eda45
  1. 46
      src/ImageSharp/Processing/Processors/Transforms/ResamplingWeightedProcessor.Weights.cs
  2. 4
      tests/ImageSharp.Tests/Processing/Transforms/ResizeProfilingBenchmarks.cs

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

@ -27,31 +27,54 @@ namespace ImageSharp.Processing.Processors
public int Left;
/// <summary>
/// The span of weights pointing to <see cref="WeightsBuffer"/>.
/// The length of the weights window
/// </summary>
public Span<float> Span;
public int Length;
/// <summary>
/// The index in the destination buffer
/// </summary>
private readonly int destIndex;
/// <summary>
/// The weights buffer <see cref="WeightsBuffer"/>.
/// </summary>
private readonly Buffer2D<float> buffer;
/// <summary>
/// Initializes a new instance of the <see cref="WeightsWindow"/> struct.
/// </summary>
/// <param name="index">The destination index in the buffer</param>
/// <param name="left">The local left index</param>
/// <param name="span">The span</param>
/// <param name="buffer">The span</param>
/// <param name="length">The length of the window</param>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal WeightsWindow(int left, Span<float> span)
internal WeightsWindow(int index, int left, Buffer2D<float> buffer, int length)
{
this.destIndex = index;
this.Left = left;
this.Span = span;
this.buffer = buffer;
this.Length = length;
}
/// <summary>
/// Gets an unsafe float* pointer to the beginning of <see cref="Span"/>.
/// Gets an unsafe float* pointer to the beginning of <see cref="buffer"/>.
/// </summary>
public ref float Ptr => ref this.Span.DangerousGetPinnableReference();
public ref float Ptr
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get
{
return ref this.GetWindowSpan().DangerousGetPinnableReference();
}
}
/// <summary>
/// Gets the lenghth of the weights window
/// Gets the span representing the portion of the <see cref="WeightsBuffer"/> that this window covers
/// </summary>
public int Length => this.Span.Length;
/// <returns>The <see cref="Span{T}"/></returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Span<float> GetWindowSpan() => this.buffer.GetRowSpan(this.destIndex).Slice(this.Left, this.Length);
/// <summary>
/// Computes the sum of vectors in 'rowSpan' weighted by weight values, pointed by this <see cref="WeightsWindow"/> instance.
@ -139,7 +162,7 @@ namespace ImageSharp.Processing.Processors
/// </summary>
internal class WeightsBuffer : IDisposable
{
private Buffer2D<float> dataBuffer;
private readonly Buffer2D<float> dataBuffer;
/// <summary>
/// Initializes a new instance of the <see cref="WeightsBuffer"/> class.
@ -174,8 +197,7 @@ namespace ImageSharp.Processing.Processors
/// <returns>The weights</returns>
public WeightsWindow GetWeightsWindow(int destIdx, int leftIdx, int rightIdx)
{
Span<float> 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);
}
}
}

4
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<Rgba32>.WeightsWindow window in weights.Weights)
{
Span<float> 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("| ");
}

Loading…
Cancel
Save