From 626488e17b09e388826253ca4ae520d51b9f2fff Mon Sep 17 00:00:00 2001 From: Ynse Hoornenborg Date: Tue, 30 Aug 2022 21:29:24 +0200 Subject: [PATCH] Preserve alpha in separate loop --- .../Convolution/MedianRowOperation{TPixel}.cs | 54 +++++++++++++------ 1 file changed, 39 insertions(+), 15 deletions(-) diff --git a/src/ImageSharp/Processing/Processors/Convolution/MedianRowOperation{TPixel}.cs b/src/ImageSharp/Processing/Processors/Convolution/MedianRowOperation{TPixel}.cs index 0678652ec9..c3f32a7178 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/MedianRowOperation{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/MedianRowOperation{TPixel}.cs @@ -59,34 +59,58 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution var xChannel = channelBuffer.Slice(0, kernelCount); var yChannel = channelBuffer.Slice(this.yChannelStart, kernelCount); var zChannel = channelBuffer.Slice(this.zChannelStart, kernelCount); - var wChannel = channelBuffer.Slice(this.wChannelStart, kernelCount); var xOffsets = this.map.GetColumnOffsetSpan(); var yOffsets = this.map.GetRowOffsetSpan(); var baseXOffsetIndex = 0; var baseYOffsetIndex = (y - this.bounds.Top) * this.kernelSize; - for (var x = boundsLeft; x < boundsRight; x++) + if (this.preserveAlpha) { - var index = 0; - for (var w = 0; w < this.kernelSize; w++) + for (var x = boundsLeft; x < boundsRight; x++) { - var j = yOffsets[baseYOffsetIndex + w]; - var row = this.sourcePixels.DangerousGetRowSpan(j); - for (var z = 0; z < this.kernelSize; z++) + var index = 0; + for (var w = 0; w < this.kernelSize; w++) { - var k = xOffsets[baseXOffsetIndex + z]; - var pixel = row[k]; - kernelBuffer[index + z] = pixel.ToVector4(); + var j = yOffsets[baseYOffsetIndex + w]; + var row = this.sourcePixels.DangerousGetRowSpan(j); + for (var z = 0; z < this.kernelSize; z++) + { + var k = xOffsets[baseXOffsetIndex + z]; + var pixel = row[k]; + kernelBuffer[index + z] = pixel.ToVector4(); + } + + index += this.kernelSize; } - index += this.kernelSize; + targetBuffer[x - boundsLeft] = this.FindMedian3(kernelBuffer, xChannel, yChannel, zChannel, kernelCount); + baseXOffsetIndex += this.kernelSize; } + } + else + { + var wChannel = channelBuffer.Slice(this.wChannelStart, kernelCount); + for (var x = boundsLeft; x < boundsRight; x++) + { + var index = 0; + for (var w = 0; w < this.kernelSize; w++) + { + var j = yOffsets[baseYOffsetIndex + w]; + var row = this.sourcePixels.DangerousGetRowSpan(j); + for (var z = 0; z < this.kernelSize; z++) + { + var k = xOffsets[baseXOffsetIndex + z]; + var pixel = row[k]; + kernelBuffer[index + z] = pixel.ToVector4(); + } + + index += this.kernelSize; + } - targetBuffer[x - boundsLeft] = this.preserveAlpha ? - this.FindMedian3(kernelBuffer, xChannel, yChannel, zChannel, kernelCount) : - this.FindMedian4(kernelBuffer, xChannel, yChannel, zChannel, wChannel, kernelCount); - baseXOffsetIndex += this.kernelSize; + targetBuffer[x - boundsLeft] = this.FindMedian4(kernelBuffer, xChannel, yChannel, zChannel, wChannel, kernelCount); + baseXOffsetIndex += this.kernelSize; + } } Span targetRowSpan = this.targetPixels.DangerousGetRowSpan(y).Slice(boundsLeft, boundsWidth);