Browse Source

Preserve alpha in separate loop

pull/2219/head
Ynse Hoornenborg 4 years ago
parent
commit
626488e17b
  1. 54
      src/ImageSharp/Processing/Processors/Convolution/MedianRowOperation{TPixel}.cs

54
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<TPixel> targetRowSpan = this.targetPixels.DangerousGetRowSpan(y).Slice(boundsLeft, boundsWidth);

Loading…
Cancel
Save