Browse Source

reapply unsafe optimizations

af/merge-core
Anton Firszov 7 years ago
parent
commit
ea2682ff32
  1. 8
      src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeKernel.cs
  2. 13
      src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeWorker.cs

8
src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeKernel.cs

@ -55,11 +55,11 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms
[MethodImpl(InliningOptions.ShortMethod)]
public Vector4 Convolve(Span<Vector4> rowSpan)
{
return this.ConvolveCore(rowSpan.Slice(this.StartIndex));
return this.ConvolveCore(ref rowSpan[this.StartIndex]);
}
[MethodImpl(InliningOptions.ShortMethod)]
public Vector4 ConvolveCore(Span<Vector4> offsetedRowSpan)
public Vector4 ConvolveCore(ref Vector4 rowStartRef)
{
ref float horizontalValues = ref Unsafe.AsRef<float>(this.bufferPtr);
@ -70,8 +70,8 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms
{
float weight = Unsafe.Add(ref horizontalValues, i);
// Vector4 v = Unsafe.Add(ref rowStartRef, i);
Vector4 v = offsetedRowSpan[i];
// Vector4 v = offsetedRowSpan[i];
Vector4 v = Unsafe.Add(ref rowStartRef, i);
result += v * weight;
}

13
src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeWorker.cs

@ -125,10 +125,11 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms
for (int x = 0; x < this.destWidth; x++)
{
Span<Vector4> firstPassColumn = this.GetColumnSpan(x).Slice(top);
// Span<Vector4> firstPassColumn = this.GetColumnSpan(x).Slice(top);
ref Vector4 firstPassColumnBase = ref this.GetColumnSpan(x)[top];
// Destination color components
Unsafe.Add(ref tempRowBase, x) = kernel.ConvolveCore(firstPassColumn);
Unsafe.Add(ref tempRowBase, x) = kernel.ConvolveCore(ref firstPassColumnBase);
}
Span<TPixel> targetRowSpan = destination.GetRowSpan(y);
@ -174,15 +175,15 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms
tempRowSpan,
this.conversionModifiers);
// ref Vector4 firstPassBaseRef = ref this.buffer.Span[y - top];
Span<Vector4> firstPassSpan = this.transposedFirstPassBuffer.Span.Slice(y - this.currentWindow.Min);
// Span<Vector4> firstPassSpan = this.transposedFirstPassBuffer.Span.Slice(y - this.currentWindow.Min);
ref Vector4 firstPassBaseRef = ref this.transposedFirstPassBuffer.Span[y - this.currentWindow.Min];
for (int x = this.targetWorkingRect.Left; x < this.targetWorkingRect.Right; x++)
{
ResizeKernel kernel = this.horizontalKernelMap.GetKernel(x - this.targetOrigin.X);
firstPassSpan[x * this.workerHeight] = kernel.Convolve(tempRowSpan);
// Unsafe.Add(ref firstPassBaseRef, x * this.sourceRectangle.Height) = kernel.Convolve(tempRowSpan);
// firstPassSpan[x * this.workerHeight] = kernel.Convolve(tempRowSpan);
Unsafe.Add(ref firstPassBaseRef, x * this.workerHeight) = kernel.Convolve(tempRowSpan);
}
}
}

Loading…
Cancel
Save