From ea2682ff329f292da0f6a3852bf317cf294d7760 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Fri, 19 Apr 2019 23:02:10 +0200 Subject: [PATCH] reapply unsafe optimizations --- .../Processors/Transforms/Resize/ResizeKernel.cs | 8 ++++---- .../Processors/Transforms/Resize/ResizeWorker.cs | 13 +++++++------ 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeKernel.cs b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeKernel.cs index 71cba9056..dce4e70d6 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeKernel.cs +++ b/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 rowSpan) { - return this.ConvolveCore(rowSpan.Slice(this.StartIndex)); + return this.ConvolveCore(ref rowSpan[this.StartIndex]); } [MethodImpl(InliningOptions.ShortMethod)] - public Vector4 ConvolveCore(Span offsetedRowSpan) + public Vector4 ConvolveCore(ref Vector4 rowStartRef) { ref float horizontalValues = ref Unsafe.AsRef(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; } diff --git a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeWorker.cs b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeWorker.cs index ed505e221..9b7d1d17c 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeWorker.cs +++ b/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 firstPassColumn = this.GetColumnSpan(x).Slice(top); + // Span 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 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 firstPassSpan = this.transposedFirstPassBuffer.Span.Slice(y - this.currentWindow.Min); + // Span 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); } } }