|
|
|
@ -55,14 +55,14 @@ namespace SixLabors.ImageSharp.Processing.Processors.Overlays |
|
|
|
using IMemoryOwner<TPixel> rowColors = allocator.Allocate<TPixel>(interest.Width); |
|
|
|
rowColors.GetSpan().Fill(glowColor); |
|
|
|
|
|
|
|
var operation = new RowIntervalOperation(configuration, interest, rowColors, this.blender, center, maxDistance, blendPercent, source); |
|
|
|
ParallelRowIterator.IterateRowIntervals<RowIntervalOperation, float>( |
|
|
|
var operation = new RowOperation(configuration, interest, rowColors, this.blender, center, maxDistance, blendPercent, source); |
|
|
|
ParallelRowIterator.IterateRows<RowOperation, float>( |
|
|
|
configuration, |
|
|
|
interest, |
|
|
|
in operation); |
|
|
|
} |
|
|
|
|
|
|
|
private readonly struct RowIntervalOperation : IRowIntervalOperation<float> |
|
|
|
private readonly struct RowOperation : IRowOperation<float> |
|
|
|
{ |
|
|
|
private readonly Configuration configuration; |
|
|
|
private readonly Rectangle bounds; |
|
|
|
@ -74,7 +74,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Overlays |
|
|
|
private readonly ImageFrame<TPixel> source; |
|
|
|
|
|
|
|
[MethodImpl(InliningOptions.ShortMethod)] |
|
|
|
public RowIntervalOperation( |
|
|
|
public RowOperation( |
|
|
|
Configuration configuration, |
|
|
|
Rectangle bounds, |
|
|
|
IMemoryOwner<TPixel> colors, |
|
|
|
@ -95,27 +95,24 @@ namespace SixLabors.ImageSharp.Processing.Processors.Overlays |
|
|
|
} |
|
|
|
|
|
|
|
[MethodImpl(InliningOptions.ShortMethod)] |
|
|
|
public void Invoke(in RowInterval rows, Span<float> span) |
|
|
|
public void Invoke(int y, Span<float> span) |
|
|
|
{ |
|
|
|
Span<TPixel> colorSpan = this.colors.GetSpan(); |
|
|
|
|
|
|
|
for (int y = rows.Min; y < rows.Max; y++) |
|
|
|
for (int i = 0; i < this.bounds.Width; i++) |
|
|
|
{ |
|
|
|
for (int i = 0; i < this.bounds.Width; i++) |
|
|
|
{ |
|
|
|
float distance = Vector2.Distance(this.center, new Vector2(i + this.bounds.X, y)); |
|
|
|
span[i] = (this.blendPercent * (1 - (.95F * (distance / this.maxDistance)))).Clamp(0, 1); |
|
|
|
} |
|
|
|
float distance = Vector2.Distance(this.center, new Vector2(i + this.bounds.X, y)); |
|
|
|
span[i] = (this.blendPercent * (1 - (.95F * (distance / this.maxDistance)))).Clamp(0, 1); |
|
|
|
} |
|
|
|
|
|
|
|
Span<TPixel> destination = this.source.GetPixelRowSpan(y).Slice(this.bounds.X, this.bounds.Width); |
|
|
|
Span<TPixel> destination = this.source.GetPixelRowSpan(y).Slice(this.bounds.X, this.bounds.Width); |
|
|
|
|
|
|
|
this.blender.Blend( |
|
|
|
this.configuration, |
|
|
|
destination, |
|
|
|
destination, |
|
|
|
colorSpan, |
|
|
|
span); |
|
|
|
} |
|
|
|
this.blender.Blend( |
|
|
|
this.configuration, |
|
|
|
destination, |
|
|
|
destination, |
|
|
|
colorSpan, |
|
|
|
span); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|