Browse Source

remove old implementations

af/merge-core
Anton Firszov 7 years ago
parent
commit
b7c3914dfa
  1. 3
      src/ImageSharp/Common/ParallelUtils/ParallelHelper.cs
  2. 65
      src/ImageSharp/Processing/Processors/Convolution/Convolution2DProcessor.cs
  3. 40
      src/ImageSharp/Processing/Processors/Convolution/Convolution2PassProcessor.cs
  4. 47
      src/ImageSharp/Processing/Processors/Convolution/ConvolutionProcessor.cs
  5. 29
      src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorCompassProcessor.cs

3
src/ImageSharp/Common/ParallelUtils/ParallelHelper.cs

@ -13,7 +13,8 @@ using SixLabors.Primitives;
namespace SixLabors.ImageSharp.ParallelUtils
{
/// <summary>
/// Utility methods wrapping Parallel.For() execution optimized for image processing.
/// Utility methods for batched processing of pixel row intervals.
/// Parallel execution is optimized for image processing.
/// Use this instead of direct <see cref="Parallel"/> calls!
/// </summary>
internal static class ParallelHelper

65
src/ImageSharp/Processing/Processors/Convolution/Convolution2DProcessor.cs

@ -68,7 +68,6 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
var workingRectangle = Rectangle.FromLTRB(startX, startY, endX, endY);
#if true
ParallelHelper.IterateRows(
workingRectangle,
configuration,
@ -133,70 +132,6 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
}
}
});
#else
ParallelFor.WithConfiguration(
startY,
endY,
configuration,
y =>
{
Span<TPixel> sourceRow = source.GetPixelRowSpan(y);
Span<TPixel> targetRow = targetPixels.GetRowSpan(y);
for (int x = startX; x < endX; x++)
{
float rX = 0;
float gX = 0;
float bX = 0;
float rY = 0;
float gY = 0;
float bY = 0;
// Apply each matrix multiplier to the color components for each pixel.
for (int fy = 0; fy < kernelYHeight; fy++)
{
int fyr = fy - radiusY;
int offsetY = y + fyr;
offsetY = offsetY.Clamp(0, maxY);
Span<TPixel> sourceOffsetRow = source.GetPixelRowSpan(offsetY);
for (int fx = 0; fx < kernelXWidth; fx++)
{
int fxr = fx - radiusX;
int offsetX = x + fxr;
offsetX = offsetX.Clamp(0, maxX);
Vector4 currentColor = sourceOffsetRow[offsetX].ToVector4().Premultiply();
if (fy < kernelXHeight)
{
Vector4 kx = this.KernelX[fy, fx] * currentColor;
rX += kx.X;
gX += kx.Y;
bX += kx.Z;
}
if (fx < kernelYWidth)
{
Vector4 ky = this.KernelY[fy, fx] * currentColor;
rY += ky.X;
gY += ky.Y;
bY += ky.Z;
}
}
}
float red = MathF.Sqrt((rX * rX) + (rY * rY));
float green = MathF.Sqrt((gX * gX) + (gY * gY));
float blue = MathF.Sqrt((bX * bX) + (bY * bY));
ref TPixel pixel = ref targetRow[x];
pixel.PackFromVector4(
new Vector4(red, green, blue, sourceRow[x].ToVector4().W).UnPremultiply());
}
});
#endif
Buffer2D<TPixel>.SwapOrCopyContent(source.PixelBuffer, targetPixels);
}

40
src/ImageSharp/Processing/Processors/Convolution/Convolution2PassProcessor.cs

@ -85,7 +85,6 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
var workingRectangle = Rectangle.FromLTRB(startX, startY, endX, endY);
#if true
ParallelHelper.IterateRows(
workingRectangle,
configuration,
@ -125,45 +124,6 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
}
}
});
#else
ParallelFor.WithConfiguration(
startY,
endY,
configuration,
y =>
{
Span<TPixel> targetRow = targetPixels.GetRowSpan(y);
for (int x = startX; x < endX; x++)
{
Vector4 destination = default;
// Apply each matrix multiplier to the color components for each pixel.
for (int fy = 0; fy < kernelHeight; fy++)
{
int fyr = fy - radiusY;
int offsetY = y + fyr;
offsetY = offsetY.Clamp(0, maxY);
Span<TPixel> row = sourcePixels.GetRowSpan(offsetY);
for (int fx = 0; fx < kernelWidth; fx++)
{
int fxr = fx - radiusX;
int offsetX = x + fxr;
offsetX = offsetX.Clamp(0, maxX);
Vector4 currentColor = row[offsetX].ToVector4().Premultiply();
destination += kernel[fy, fx] * currentColor;
}
}
ref TPixel pixel = ref targetRow[x];
pixel.PackFromVector4(destination.UnPremultiply());
}
});
#endif
}
}
}

47
src/ImageSharp/Processing/Processors/Convolution/ConvolutionProcessor.cs

@ -55,7 +55,6 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
var workingRect = Rectangle.FromLTRB(startX, startY, endX, endY);
#if true
ParallelHelper.IterateRows(
workingRect,
configuration,
@ -103,52 +102,6 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
}
}
});
#else
ParallelFor.WithConfiguration(
startY,
endY,
configuration,
y =>
{
Span<TPixel> sourceRow = source.GetPixelRowSpan(y);
Span<TPixel> targetRow = targetPixels.GetRowSpan(y);
for (int x = startX; x < endX; x++)
{
float red = 0;
float green = 0;
float blue = 0;
// Apply each matrix multiplier to the color components for each pixel.
for (int fy = 0; fy < kernelLength; fy++)
{
int fyr = fy - radius;
int offsetY = y + fyr;
offsetY = offsetY.Clamp(0, maxY);
Span<TPixel> sourceOffsetRow = source.GetPixelRowSpan(offsetY);
for (int fx = 0; fx < kernelLength; fx++)
{
int fxr = fx - radius;
int offsetX = x + fxr;
offsetX = offsetX.Clamp(0, maxX);
Vector4 currentColor = sourceOffsetRow[offsetX].ToVector4().Premultiply();
currentColor *= this.KernelXY[fy, fx];
red += currentColor.X;
green += currentColor.Y;
blue += currentColor.Z;
}
}
ref TPixel pixel = ref targetRow[x];
pixel.PackFromVector4(new Vector4(red, green, blue, sourceRow[x].ToVector4().W).UnPremultiply());
}
});
#endif
Buffer2D<TPixel>.SwapOrCopyContent(source.PixelBuffer, targetPixels);
}

29
src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorCompassProcessor.cs

@ -138,7 +138,6 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
Buffer2D<TPixel> passPixels = pass.PixelBuffer;
Buffer2D<TPixel> targetPixels = source.PixelBuffer;
#if true
ParallelHelper.IterateRows(
workingRect,
configuration,
@ -170,34 +169,6 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution
}
}
});
#else
ParallelFor.WithConfiguration(
minY,
maxY,
configuration,
y =>
{
int offsetY = y - shiftY;
ref TPixel passPixelsBase = ref MemoryMarshal.GetReference(passPixels.GetRowSpan(offsetY));
ref TPixel targetPixelsBase = ref MemoryMarshal.GetReference(targetPixels.GetRowSpan(offsetY));
for (int x = minX; x < maxX; x++)
{
int offsetX = x - shiftX;
// Grab the max components of the two pixels
ref TPixel currentPassPixel = ref Unsafe.Add(ref passPixelsBase, offsetX);
ref TPixel currentTargetPixel = ref Unsafe.Add(ref targetPixelsBase, offsetX);
var pixelValue = Vector4.Max(
currentPassPixel.ToVector4(),
currentTargetPixel.ToVector4());
currentTargetPixel.PackFromVector4(pixelValue);
}
});
#endif
}
}
}

Loading…
Cancel
Save