mirror of https://github.com/SixLabors/ImageSharp
1 changed files with 0 additions and 121 deletions
@ -1,121 +0,0 @@ |
|||||
// Copyright (c) Six Labors and contributors.
|
|
||||
// Licensed under the Apache License, Version 2.0.
|
|
||||
|
|
||||
using System; |
|
||||
using System.Threading.Tasks; |
|
||||
using SixLabors.ImageSharp.Advanced; |
|
||||
using SixLabors.ImageSharp.Memory; |
|
||||
using SixLabors.ImageSharp.PixelFormats; |
|
||||
using SixLabors.ImageSharp.Processing.Drawing.Brushes; |
|
||||
using SixLabors.ImageSharp.Processing.Processors; |
|
||||
using SixLabors.Primitives; |
|
||||
|
|
||||
namespace SixLabors.ImageSharp.Processing.Drawing.Processors |
|
||||
{ |
|
||||
/// <summary>
|
|
||||
/// Using the brush as a source of pixels colors blends the brush color with source.
|
|
||||
/// </summary>
|
|
||||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|
||||
internal class FillProcessor<TPixel> : ImageProcessor<TPixel> |
|
||||
where TPixel : struct, IPixel<TPixel> |
|
||||
{ |
|
||||
/// <summary>
|
|
||||
/// The brush.
|
|
||||
/// </summary>
|
|
||||
private readonly IBrush<TPixel> brush; |
|
||||
private readonly GraphicsOptions options; |
|
||||
|
|
||||
/// <summary>
|
|
||||
/// Initializes a new instance of the <see cref="FillProcessor{TPixel}"/> class.
|
|
||||
/// </summary>
|
|
||||
/// <param name="brush">The brush to source pixel colors from.</param>
|
|
||||
/// <param name="options">The options</param>
|
|
||||
public FillProcessor(IBrush<TPixel> brush, GraphicsOptions options) |
|
||||
{ |
|
||||
this.brush = brush; |
|
||||
this.options = options; |
|
||||
} |
|
||||
|
|
||||
/// <inheritdoc/>
|
|
||||
protected override void OnFrameApply(ImageFrame<TPixel> source, Rectangle sourceRectangle, Configuration configuration) |
|
||||
{ |
|
||||
int startX = sourceRectangle.X; |
|
||||
int endX = sourceRectangle.Right; |
|
||||
int startY = sourceRectangle.Y; |
|
||||
int endY = sourceRectangle.Bottom; |
|
||||
|
|
||||
// Align start/end positions.
|
|
||||
int minX = Math.Max(0, startX); |
|
||||
int maxX = Math.Min(source.Width, endX); |
|
||||
int minY = Math.Max(0, startY); |
|
||||
int maxY = Math.Min(source.Height, endY); |
|
||||
|
|
||||
int width = maxX - minX; |
|
||||
|
|
||||
<<<<<<< HEAD |
|
||||
var solidBrush = this.brush as SolidBrush<TPixel>; |
|
||||
======= |
|
||||
using (IBuffer<float> amount = source.MemoryManager.Allocate<float>(width)) |
|
||||
using (BrushApplicator<TPixel> applicator = this.brush.CreateApplicator( |
|
||||
source, |
|
||||
sourceRectangle, |
|
||||
this.options)) |
|
||||
{ |
|
||||
amount.Span.Fill(1f); |
|
||||
>>>>>>> master |
|
||||
|
|
||||
// If there's no reason for blending, then avoid it.
|
|
||||
if (solidBrush != null && |
|
||||
( |
|
||||
(this.options.BlenderMode == PixelBlenderMode.Normal && this.options.BlendPercentage == 1f && solidBrush.Color.ToVector4().W == 1f) || |
|
||||
(this.options.BlenderMode == PixelBlenderMode.Over && this.options.BlendPercentage == 1f && solidBrush.Color.ToVector4().W == 1f) || |
|
||||
(this.options.BlenderMode == PixelBlenderMode.Src))) |
|
||||
{ |
|
||||
Parallel.For( |
|
||||
minY, |
|
||||
maxY, |
|
||||
configuration.ParallelOptions, |
|
||||
y => |
|
||||
{ |
|
||||
int offsetY = y - startY; |
|
||||
int offsetX = minX - startX; |
|
||||
source.GetPixelRowSpan(y).Slice(minX, width).Fill(solidBrush.Color); |
|
||||
}); |
|
||||
} |
|
||||
else |
|
||||
{ |
|
||||
// Reset offset if necessary.
|
|
||||
if (minX > 0) |
|
||||
{ |
|
||||
startX = 0; |
|
||||
} |
|
||||
|
|
||||
if (minY > 0) |
|
||||
{ |
|
||||
startY = 0; |
|
||||
} |
|
||||
|
|
||||
using (IBuffer<float> amount = source.MemoryManager.Allocate<float>(width)) |
|
||||
using (BrushApplicator<TPixel> applicator = this.brush.CreateApplicator( |
|
||||
source, |
|
||||
sourceRectangle, |
|
||||
this.options)) |
|
||||
{ |
|
||||
amount.Span.Fill(this.options.BlendPercentage); |
|
||||
|
|
||||
Parallel.For( |
|
||||
minY, |
|
||||
maxY, |
|
||||
configuration.ParallelOptions, |
|
||||
y => |
|
||||
{ |
|
||||
int offsetY = y - startY; |
|
||||
int offsetX = minX - startX; |
|
||||
|
|
||||
applicator.Apply(amount.Span, offsetX, offsetY); |
|
||||
}); |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
Loading…
Reference in new issue