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)] [MethodImpl(InliningOptions.ShortMethod)]
public Vector4 Convolve(Span<Vector4> rowSpan) public Vector4 Convolve(Span<Vector4> rowSpan)
{ {
return this.ConvolveCore(rowSpan.Slice(this.StartIndex)); return this.ConvolveCore(ref rowSpan[this.StartIndex]);
} }
[MethodImpl(InliningOptions.ShortMethod)] [MethodImpl(InliningOptions.ShortMethod)]
public Vector4 ConvolveCore(Span<Vector4> offsetedRowSpan) public Vector4 ConvolveCore(ref Vector4 rowStartRef)
{ {
ref float horizontalValues = ref Unsafe.AsRef<float>(this.bufferPtr); 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); 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; 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++) 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 // 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); Span<TPixel> targetRowSpan = destination.GetRowSpan(y);
@ -174,15 +175,15 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms
tempRowSpan, tempRowSpan,
this.conversionModifiers); 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++) for (int x = this.targetWorkingRect.Left; x < this.targetWorkingRect.Right; x++)
{ {
ResizeKernel kernel = this.horizontalKernelMap.GetKernel(x - this.targetOrigin.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