diff --git a/src/ImageSharp/Color/Color.cs b/src/ImageSharp/Color/Color.cs
index bc97393cc..021cea415 100644
--- a/src/ImageSharp/Color/Color.cs
+++ b/src/ImageSharp/Color/Color.cs
@@ -86,6 +86,8 @@ namespace SixLabors.ImageSharp
public static Color FromRgba(byte r, byte g, byte b, byte a) => new Color(new Rgba32(r, g, b, a));
+ public static Color FromRgb(byte r, byte g, byte b) => FromRgba(r, g, b, 255);
+
///
/// Creates a new instance from the string representing a color in hexadecimal form.
///
diff --git a/src/ImageSharp/Primitives/ValueSize.cs b/src/ImageSharp/Primitives/ValueSize.cs
index 44bee5030..577e9187a 100644
--- a/src/ImageSharp/Primitives/ValueSize.cs
+++ b/src/ImageSharp/Primitives/ValueSize.cs
@@ -7,7 +7,7 @@ using SixLabors.Primitives;
namespace SixLabors.ImageSharp.Primitives
{
///
- /// Represents a value in relation to a value on the image
+ /// Represents a value in relation to a value on the image.
///
internal readonly struct ValueSize : IEquatable
{
diff --git a/src/ImageSharp/Processing/BackgroundColorExtensions.cs b/src/ImageSharp/Processing/BackgroundColorExtensions.cs
index 3b794e335..dd1cc1ed2 100644
--- a/src/ImageSharp/Processing/BackgroundColorExtensions.cs
+++ b/src/ImageSharp/Processing/BackgroundColorExtensions.cs
@@ -1,7 +1,6 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
-using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing.Processors.Overlays;
using SixLabors.Primitives;
@@ -16,53 +15,55 @@ namespace SixLabors.ImageSharp.Processing
///
/// Replaces the background color of image with the given one.
///
- /// The pixel format.
/// The image this method extends.
/// The color to set as the background.
- /// The .
- public static IImageProcessingContext BackgroundColor(this IImageProcessingContext source, TPixel color)
- where TPixel : struct, IPixel
- => BackgroundColor(source, GraphicsOptions.Default, color);
+ /// The to allow chaining of operations.
+ public static IImageProcessingContext BackgroundColor(this IImageProcessingContext source, Color color) =>
+ BackgroundColor(source, GraphicsOptions.Default, color);
///
/// Replaces the background color of image with the given one.
///
- /// The pixel format.
/// The image this method extends.
/// The color to set as the background.
///
/// The structure that specifies the portion of the image object to alter.
///
- /// The .
- public static IImageProcessingContext BackgroundColor(this IImageProcessingContext source, TPixel color, Rectangle rectangle)
- where TPixel : struct, IPixel
- => BackgroundColor(source, GraphicsOptions.Default, color, rectangle);
+ /// The to allow chaining of operations.
+ public static IImageProcessingContext BackgroundColor(
+ this IImageProcessingContext source,
+ Color color,
+ Rectangle rectangle) =>
+ BackgroundColor(source, GraphicsOptions.Default, color, rectangle);
///
/// Replaces the background color of image with the given one.
///
- /// The pixel format.
/// The image this method extends.
/// The options effecting pixel blending.
/// The color to set as the background.
- /// The .
- public static IImageProcessingContext BackgroundColor(this IImageProcessingContext source, GraphicsOptions options, TPixel color)
- where TPixel : struct, IPixel
- => source.ApplyProcessor(new BackgroundColorProcessor(color, options));
+ /// The to allow chaining of operations.
+ public static IImageProcessingContext BackgroundColor(
+ this IImageProcessingContext source,
+ GraphicsOptions options,
+ Color color) =>
+ source.ApplyProcessor(new BackgroundColorProcessor(color, options));
///
/// Replaces the background color of image with the given one.
///
- /// The pixel format.
/// The image this method extends.
/// The options effecting pixel blending.
/// The color to set as the background.
///
/// The structure that specifies the portion of the image object to alter.
///
- /// The .
- public static IImageProcessingContext BackgroundColor(this IImageProcessingContext source, GraphicsOptions options, TPixel color, Rectangle rectangle)
- where TPixel : struct, IPixel
- => source.ApplyProcessor(new BackgroundColorProcessor(color, options), rectangle);
+ /// The to allow chaining of operations.
+ public static IImageProcessingContext BackgroundColor(
+ this IImageProcessingContext source,
+ GraphicsOptions options,
+ Color color,
+ Rectangle rectangle) =>
+ source.ApplyProcessor(new BackgroundColorProcessor(color, options), rectangle);
}
-}
+}
\ No newline at end of file
diff --git a/src/ImageSharp/Processing/GlowExtensions.cs b/src/ImageSharp/Processing/GlowExtensions.cs
index 759fdccbe..39734882b 100644
--- a/src/ImageSharp/Processing/GlowExtensions.cs
+++ b/src/ImageSharp/Processing/GlowExtensions.cs
@@ -1,7 +1,6 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
-using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Primitives;
using SixLabors.ImageSharp.Processing.Processors.Overlays;
using SixLabors.Primitives;
@@ -17,22 +16,18 @@ namespace SixLabors.ImageSharp.Processing
///
/// Applies a radial glow effect to an image.
///
- /// The pixel format.
/// The image this method extends.
/// The to allow chaining of operations.
- public static IImageProcessingContext Glow(this IImageProcessingContext source)
- where TPixel : struct, IPixel
- => Glow(source, GraphicsOptions.Default);
+ public static IImageProcessingContext Glow(this IImageProcessingContext source) =>
+ Glow(source, GraphicsOptions.Default);
///
/// Applies a radial glow effect to an image.
///
- /// The pixel format.
/// The image this method extends.
/// The color to set as the glow.
/// The to allow chaining of operations.
- public static IImageProcessingContext Glow(this IImageProcessingContext source, TPixel color)
- where TPixel : struct, IPixel
+ public static IImageProcessingContext Glow(this IImageProcessingContext source, Color color)
{
return Glow(source, GraphicsOptions.Default, color);
}
@@ -40,31 +35,26 @@ namespace SixLabors.ImageSharp.Processing
///
/// Applies a radial glow effect to an image.
///
- /// The pixel format.
/// The image this method extends.
/// The the radius.
/// The to allow chaining of operations.
- public static IImageProcessingContext Glow(this IImageProcessingContext source, float radius)
- where TPixel : struct, IPixel
- => Glow(source, GraphicsOptions.Default, radius);
+ public static IImageProcessingContext Glow(this IImageProcessingContext source, float radius) =>
+ Glow(source, GraphicsOptions.Default, radius);
///
/// Applies a radial glow effect to an image.
///
- /// The pixel format.
/// The image this method extends.
///
/// The structure that specifies the portion of the image object to alter.
///
/// The to allow chaining of operations.
- public static IImageProcessingContext Glow(this IImageProcessingContext source, Rectangle rectangle)
- where TPixel : struct, IPixel
- => source.Glow(GraphicsOptions.Default, rectangle);
+ public static IImageProcessingContext Glow(this IImageProcessingContext source, Rectangle rectangle) =>
+ source.Glow(GraphicsOptions.Default, rectangle);
///
/// Applies a radial glow effect to an image.
///
- /// The pixel format.
/// The image this method extends.
/// The color to set as the glow.
/// The the radius.
@@ -72,63 +62,66 @@ namespace SixLabors.ImageSharp.Processing
/// The structure that specifies the portion of the image object to alter.
///
/// The to allow chaining of operations.
- public static IImageProcessingContext Glow(this IImageProcessingContext source, TPixel color, float radius, Rectangle rectangle)
- where TPixel : struct, IPixel
- => source.Glow(GraphicsOptions.Default, color, ValueSize.Absolute(radius), rectangle);
+ public static IImageProcessingContext Glow(
+ this IImageProcessingContext source,
+ Color color,
+ float radius,
+ Rectangle rectangle) =>
+ source.Glow(GraphicsOptions.Default, color, ValueSize.Absolute(radius), rectangle);
///
/// Applies a radial glow effect to an image.
///
- /// The pixel format.
/// The image this method extends.
/// The options effecting things like blending.
/// The to allow chaining of operations.
- public static IImageProcessingContext Glow(this IImageProcessingContext source, GraphicsOptions options)
- where TPixel : struct, IPixel
- => source.Glow(options, NamedColors.Black, ValueSize.PercentageOfWidth(0.5f));
+ public static IImageProcessingContext Glow(this IImageProcessingContext source, GraphicsOptions options) =>
+ source.Glow(options, Color.Black, ValueSize.PercentageOfWidth(0.5f));
///
/// Applies a radial glow effect to an image.
///
- /// The pixel format.
/// The image this method extends.
/// The options effecting things like blending.
/// The color to set as the glow.
/// The to allow chaining of operations.
- public static IImageProcessingContext Glow(this IImageProcessingContext source, GraphicsOptions options, TPixel color)
- where TPixel : struct, IPixel
- => source.Glow(options, color, ValueSize.PercentageOfWidth(0.5f));
+ public static IImageProcessingContext Glow(
+ this IImageProcessingContext source,
+ GraphicsOptions options,
+ Color color) =>
+ source.Glow(options, color, ValueSize.PercentageOfWidth(0.5f));
///
/// Applies a radial glow effect to an image.
///
- /// The pixel format.
/// The image this method extends.
/// The options effecting things like blending.
/// The the radius.
/// The to allow chaining of operations.
- public static IImageProcessingContext Glow(this IImageProcessingContext source, GraphicsOptions options, float radius)
- where TPixel : struct, IPixel
- => source.Glow(options, NamedColors.Black, ValueSize.Absolute(radius));
+ public static IImageProcessingContext Glow(
+ this IImageProcessingContext source,
+ GraphicsOptions options,
+ float radius) =>
+ source.Glow(options, Color.Black, ValueSize.Absolute(radius));
///
/// Applies a radial glow effect to an image.
///
- /// The pixel format.
/// The image this method extends.
/// The options effecting things like blending.
///
/// The structure that specifies the portion of the image object to alter.
///
/// The to allow chaining of operations.
- public static IImageProcessingContext Glow(this IImageProcessingContext source, GraphicsOptions options, Rectangle rectangle)
- where TPixel : struct, IPixel
- => source.Glow(options, NamedColors.Black, ValueSize.PercentageOfWidth(0.5f), rectangle);
+ public static IImageProcessingContext Glow(
+ this IImageProcessingContext source,
+ GraphicsOptions options,
+ Rectangle rectangle) =>
+ source.Glow(options, Color.Black, ValueSize.PercentageOfWidth(0.5f), rectangle);
///
/// Applies a radial glow effect to an image.
///
- /// The pixel format.
/// The image this method extends.
/// The options effecting things like blending.
/// The color to set as the glow.
@@ -137,14 +130,17 @@ namespace SixLabors.ImageSharp.Processing
/// The structure that specifies the portion of the image object to alter.
///
/// The to allow chaining of operations.
- public static IImageProcessingContext Glow(this IImageProcessingContext source, GraphicsOptions options, TPixel color, float radius, Rectangle rectangle)
- where TPixel : struct, IPixel
- => source.Glow(options, color, ValueSize.Absolute(radius), rectangle);
+ public static IImageProcessingContext Glow(
+ this IImageProcessingContext source,
+ GraphicsOptions options,
+ Color color,
+ float radius,
+ Rectangle rectangle) =>
+ source.Glow(options, color, ValueSize.Absolute(radius), rectangle);
///
/// Applies a radial glow effect to an image.
///
- /// The pixel format.
/// The image this method extends.
/// The options effecting things like blending.
/// The color to set as the glow.
@@ -153,21 +149,27 @@ namespace SixLabors.ImageSharp.Processing
/// The structure that specifies the portion of the image object to alter.
///
/// The to allow chaining of operations.
- private static IImageProcessingContext Glow(this IImageProcessingContext source, GraphicsOptions options, TPixel color, ValueSize radius, Rectangle rectangle)
- where TPixel : struct, IPixel
- => source.ApplyProcessor(new GlowProcessor(color, radius, options), rectangle);
+ private static IImageProcessingContext Glow(
+ this IImageProcessingContext source,
+ GraphicsOptions options,
+ Color color,
+ ValueSize radius,
+ Rectangle rectangle) =>
+ source.ApplyProcessor(new GlowProcessor(color, radius, options), rectangle);
///
/// Applies a radial glow effect to an image.
///
- /// The pixel format.
/// The image this method extends.
/// The options effecting things like blending.
/// The color to set as the glow.
/// The the radius.
/// The to allow chaining of operations.
- private static IImageProcessingContext Glow(this IImageProcessingContext source, GraphicsOptions options, TPixel color, ValueSize radius)
- where TPixel : struct, IPixel
- => source.ApplyProcessor(new GlowProcessor(color, radius, options));
+ private static IImageProcessingContext Glow(
+ this IImageProcessingContext source,
+ GraphicsOptions options,
+ Color color,
+ ValueSize radius) =>
+ source.ApplyProcessor(new GlowProcessor(color, radius, options));
}
}
\ No newline at end of file
diff --git a/src/ImageSharp/Processing/Processors/Filters/LomographProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Filters/LomographProcessor{TPixel}.cs
index c15cf6fc9..e0f85945a 100644
--- a/src/ImageSharp/Processing/Processors/Filters/LomographProcessor{TPixel}.cs
+++ b/src/ImageSharp/Processing/Processors/Filters/LomographProcessor{TPixel}.cs
@@ -13,7 +13,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Filters
internal class LomographProcessor : FilterProcessor
where TPixel : struct, IPixel
{
- private static readonly TPixel VeryDarkGreen = ColorBuilder.FromRGBA(0, 10, 0, 255);
+ private static readonly Color VeryDarkGreen = Color.FromRgba(0, 10, 0, 255);
///
/// Initializes a new instance of the class.
@@ -27,7 +27,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Filters
///
protected override void AfterFrameApply(ImageFrame source, Rectangle sourceRectangle, Configuration configuration)
{
- new VignetteProcessor(VeryDarkGreen).Apply(source, sourceRectangle, configuration);
+ new VignetteProcessor(VeryDarkGreen).Apply(source, sourceRectangle, configuration);
}
}
}
\ No newline at end of file
diff --git a/src/ImageSharp/Processing/Processors/Filters/PolaroidProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Filters/PolaroidProcessor{TPixel}.cs
index befcfc1f4..0f511ee29 100644
--- a/src/ImageSharp/Processing/Processors/Filters/PolaroidProcessor{TPixel}.cs
+++ b/src/ImageSharp/Processing/Processors/Filters/PolaroidProcessor{TPixel}.cs
@@ -13,8 +13,9 @@ namespace SixLabors.ImageSharp.Processing.Processors.Filters
internal class PolaroidProcessor : FilterProcessor
where TPixel : struct, IPixel
{
- private static readonly TPixel VeryDarkOrange = ColorBuilder.FromRGB(102, 34, 0);
- private static readonly TPixel LightOrange = ColorBuilder.FromRGBA(255, 153, 102, 128);
+ private static readonly Color LightOrange = Color.FromRgba(255, 153, 102, 128);
+
+ private static readonly Color VeryDarkOrange = Color.FromRgb(102, 34, 0);
///
/// Initializes a new instance of the class.
@@ -26,10 +27,13 @@ namespace SixLabors.ImageSharp.Processing.Processors.Filters
}
///
- protected override void AfterFrameApply(ImageFrame source, Rectangle sourceRectangle, Configuration configuration)
+ protected override void AfterFrameApply(
+ ImageFrame source,
+ Rectangle sourceRectangle,
+ Configuration configuration)
{
- new VignetteProcessor(VeryDarkOrange).Apply(source, sourceRectangle, configuration);
- new GlowProcessor(LightOrange, source.Width / 4F).Apply(source, sourceRectangle, configuration);
+ new VignetteProcessor(VeryDarkOrange).Apply(source, sourceRectangle, configuration);
+ new GlowProcessor(LightOrange, source.Width / 4F).Apply(source, sourceRectangle, configuration);
}
}
}
\ No newline at end of file
diff --git a/src/ImageSharp/Processing/Processors/Overlays/BackgroundColorProcessor.cs b/src/ImageSharp/Processing/Processors/Overlays/BackgroundColorProcessor.cs
index 25787ff92..0dd0c4118 100644
--- a/src/ImageSharp/Processing/Processors/Overlays/BackgroundColorProcessor.cs
+++ b/src/ImageSharp/Processing/Processors/Overlays/BackgroundColorProcessor.cs
@@ -1,31 +1,21 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
-using System;
-using System.Buffers;
-using System.Threading.Tasks;
-using SixLabors.ImageSharp.Advanced;
-using SixLabors.ImageSharp.Memory;
-using SixLabors.ImageSharp.ParallelUtils;
using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.Memory;
-using SixLabors.Primitives;
namespace SixLabors.ImageSharp.Processing.Processors.Overlays
{
///
- /// Sets the background color of the image.
+ /// Defines a processing operation to replace the background color of an .
///
- /// The pixel format.
- internal class BackgroundColorProcessor : ImageProcessor
- where TPixel : struct, IPixel
+ public sealed class BackgroundColorProcessor : IImageProcessor
{
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
- /// The to set the background color to.
+ /// The to set the background color to.
/// The options defining blending algorithm and amount.
- public BackgroundColorProcessor(TPixel color, GraphicsOptions options)
+ public BackgroundColorProcessor(Color color, GraphicsOptions options)
{
this.Color = color;
this.GraphicsOptions = options;
@@ -39,69 +29,13 @@ namespace SixLabors.ImageSharp.Processing.Processors.Overlays
///
/// Gets the background color value.
///
- public TPixel Color { get; }
+ public Color Color { get; }
- ///
- protected override void OnFrameApply(ImageFrame source, Rectangle sourceRectangle, Configuration configuration)
+ ///
+ public IImageProcessor CreatePixelSpecificProcessor()
+ where TPixel : struct, IPixel
{
- int startY = sourceRectangle.Y;
- int endY = sourceRectangle.Bottom;
- int startX = sourceRectangle.X;
- int endX = sourceRectangle.Right;
-
- // 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);
-
- // Reset offset if necessary.
- if (minX > 0)
- {
- startX = 0;
- }
-
- if (minY > 0)
- {
- startY = 0;
- }
-
- int width = maxX - minX;
-
- var workingRect = Rectangle.FromLTRB(minX, minY, maxX, maxY);
-
- using (IMemoryOwner colors = source.MemoryAllocator.Allocate(width))
- using (IMemoryOwner amount = source.MemoryAllocator.Allocate(width))
- {
- // Be careful! Do not capture colorSpan & amountSpan in the lambda below!
- Span colorSpan = colors.GetSpan();
- Span amountSpan = amount.GetSpan();
-
- colorSpan.Fill(this.Color);
- amountSpan.Fill(this.GraphicsOptions.BlendPercentage);
-
- PixelBlender blender = PixelOperations.Instance.GetPixelBlender(this.GraphicsOptions);
-
- ParallelHelper.IterateRows(
- workingRect,
- configuration,
- rows =>
- {
- for (int y = rows.Min; y < rows.Max; y++)
- {
- Span destination =
- source.GetPixelRowSpan(y - startY).Slice(minX - startX, width);
-
- // This switched color & destination in the 2nd and 3rd places because we are applying the target color under the current one
- blender.Blend(
- source.Configuration,
- destination,
- colors.GetSpan(),
- destination,
- amount.GetSpan());
- }
- });
- }
+ return new BackgroundColorProcessor(this);
}
}
}
\ No newline at end of file
diff --git a/src/ImageSharp/Processing/Processors/Overlays/BackgroundColorProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Overlays/BackgroundColorProcessor{TPixel}.cs
new file mode 100644
index 000000000..c4af59fec
--- /dev/null
+++ b/src/ImageSharp/Processing/Processors/Overlays/BackgroundColorProcessor{TPixel}.cs
@@ -0,0 +1,101 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+using System;
+using System.Buffers;
+
+using SixLabors.ImageSharp.Advanced;
+using SixLabors.ImageSharp.Memory;
+using SixLabors.ImageSharp.ParallelUtils;
+using SixLabors.ImageSharp.PixelFormats;
+using SixLabors.Primitives;
+
+namespace SixLabors.ImageSharp.Processing.Processors.Overlays
+{
+ ///
+ /// Sets the background color of the image.
+ ///
+ /// The pixel format.
+ internal class BackgroundColorProcessor : ImageProcessor
+ where TPixel : struct, IPixel
+ {
+ private readonly BackgroundColorProcessor definition;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public BackgroundColorProcessor(BackgroundColorProcessor definition)
+ {
+ this.definition = definition;
+ }
+
+ ///
+ protected override void OnFrameApply(
+ ImageFrame source,
+ Rectangle sourceRectangle,
+ Configuration configuration)
+ {
+ TPixel color = this.definition.Color.ToPixel();
+ GraphicsOptions graphicsOptions = this.definition.GraphicsOptions;
+
+ int startY = sourceRectangle.Y;
+ int endY = sourceRectangle.Bottom;
+ int startX = sourceRectangle.X;
+ int endX = sourceRectangle.Right;
+
+ // 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);
+
+ // Reset offset if necessary.
+ if (minX > 0)
+ {
+ startX = 0;
+ }
+
+ if (minY > 0)
+ {
+ startY = 0;
+ }
+
+ int width = maxX - minX;
+
+ var workingRect = Rectangle.FromLTRB(minX, minY, maxX, maxY);
+
+ using (IMemoryOwner colors = source.MemoryAllocator.Allocate(width))
+ using (IMemoryOwner amount = source.MemoryAllocator.Allocate(width))
+ {
+ // Be careful! Do not capture colorSpan & amountSpan in the lambda below!
+ Span colorSpan = colors.GetSpan();
+ Span amountSpan = amount.GetSpan();
+
+ colorSpan.Fill(color);
+ amountSpan.Fill(graphicsOptions.BlendPercentage);
+
+ PixelBlender blender = PixelOperations.Instance.GetPixelBlender(graphicsOptions);
+
+ ParallelHelper.IterateRows(
+ workingRect,
+ configuration,
+ rows =>
+ {
+ for (int y = rows.Min; y < rows.Max; y++)
+ {
+ Span destination =
+ source.GetPixelRowSpan(y - startY).Slice(minX - startX, width);
+
+ // This switched color & destination in the 2nd and 3rd places because we are applying the target color under the current one
+ blender.Blend(
+ source.Configuration,
+ destination,
+ colors.GetSpan(),
+ destination,
+ amount.GetSpan());
+ }
+ });
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor.cs b/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor.cs
index 21f6be69f..4927a0ed7 100644
--- a/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor.cs
+++ b/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor.cs
@@ -1,69 +1,56 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
-using System;
-using System.Buffers;
-using System.Numerics;
-using System.Threading.Tasks;
-using SixLabors.ImageSharp.Advanced;
-using SixLabors.ImageSharp.Memory;
-using SixLabors.ImageSharp.ParallelUtils;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Primitives;
-using SixLabors.Memory;
-using SixLabors.Primitives;
namespace SixLabors.ImageSharp.Processing.Processors.Overlays
{
///
- /// An that applies a radial glow effect an .
+ /// Defines a radial glow effect applicable to an .
///
- /// The pixel format.
- internal class GlowProcessor : ImageProcessor
- where TPixel : struct, IPixel
+ public sealed class GlowProcessor : IImageProcessor
{
- private readonly PixelBlender blender;
-
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
/// The color or the glow.
- public GlowProcessor(TPixel color)
+ public GlowProcessor(Color color)
: this(color, 0)
{
}
+
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
/// The color or the glow.
- /// The radius of the glow.
- public GlowProcessor(TPixel color, ValueSize radius)
- : this(color, radius, GraphicsOptions.Default)
+ /// The options effecting blending and composition.
+ public GlowProcessor(Color color, GraphicsOptions options)
+ : this(color, 0, options)
{
}
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
/// The color or the glow.
- /// The options effecting blending and composition.
- public GlowProcessor(TPixel color, GraphicsOptions options)
- : this(color, 0, options)
+ /// The radius of the glow.
+ internal GlowProcessor(Color color, ValueSize radius)
+ : this(color, radius, GraphicsOptions.Default)
{
}
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
/// The color or the glow.
/// The radius of the glow.
/// The options effecting blending and composition.
- public GlowProcessor(TPixel color, ValueSize radius, GraphicsOptions options)
+ internal GlowProcessor(Color color, ValueSize radius, GraphicsOptions options)
{
this.GlowColor = color;
this.Radius = radius;
- this.blender = PixelOperations.Instance.GetPixelBlender(options);
this.GraphicsOptions = options;
}
@@ -73,86 +60,20 @@ namespace SixLabors.ImageSharp.Processing.Processors.Overlays
public GraphicsOptions GraphicsOptions { get; }
///
- /// Gets or sets the glow color to apply.
+ /// Gets the glow color to apply.
///
- public TPixel GlowColor { get; set; }
+ public Color GlowColor { get; }
///
- /// Gets or sets the the radius.
+ /// Gets the the radius.
///
- public ValueSize Radius { get; set; }
+ internal ValueSize Radius { get; }
- ///
- protected override void OnFrameApply(ImageFrame source, Rectangle sourceRectangle, Configuration configuration)
+ ///
+ public IImageProcessor CreatePixelSpecificProcessor()
+ where TPixel : struct, IPixel
{
- // TODO: can we simplify the rectangle calculation?
- int startY = sourceRectangle.Y;
- int endY = sourceRectangle.Bottom;
- int startX = sourceRectangle.X;
- int endX = sourceRectangle.Right;
- TPixel glowColor = this.GlowColor;
- Vector2 center = Rectangle.Center(sourceRectangle);
-
- float finalRadius = this.Radius.Calculate(source.Size());
-
- float maxDistance = finalRadius > 0 ? MathF.Min(finalRadius, sourceRectangle.Width * .5F) : sourceRectangle.Width * .5F;
-
- // 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);
-
- // Reset offset if necessary.
- if (minX > 0)
- {
- startX = 0;
- }
-
- if (minY > 0)
- {
- startY = 0;
- }
-
- int width = maxX - minX;
- int offsetX = minX - startX;
-
- var workingRect = Rectangle.FromLTRB(minX, minY, maxX, maxY);
-
- using (IMemoryOwner rowColors = source.MemoryAllocator.Allocate(width))
- {
- rowColors.GetSpan().Fill(glowColor);
-
- ParallelHelper.IterateRowsWithTempBuffer(
- workingRect,
- configuration,
- (rows, amounts) =>
- {
- Span amountsSpan = amounts.Span;
-
- for (int y = rows.Min; y < rows.Max; y++)
- {
- int offsetY = y - startY;
-
- for (int i = 0; i < width; i++)
- {
- float distance = Vector2.Distance(center, new Vector2(i + offsetX, offsetY));
- amountsSpan[i] =
- (this.GraphicsOptions.BlendPercentage * (1 - (.95F * (distance / maxDistance))))
- .Clamp(0, 1);
- }
-
- Span destination = source.GetPixelRowSpan(offsetY).Slice(offsetX, width);
-
- this.blender.Blend(
- source.Configuration,
- destination,
- destination,
- rowColors.GetSpan(),
- amountsSpan);
- }
- });
- }
+ return new GlowProcessor(this);
}
}
}
\ No newline at end of file
diff --git a/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor{TPixel}.cs
new file mode 100644
index 000000000..3201fcbfe
--- /dev/null
+++ b/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor{TPixel}.cs
@@ -0,0 +1,112 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+using System;
+using System.Buffers;
+using System.Numerics;
+
+using SixLabors.ImageSharp.Advanced;
+using SixLabors.ImageSharp.Memory;
+using SixLabors.ImageSharp.ParallelUtils;
+using SixLabors.ImageSharp.PixelFormats;
+using SixLabors.Primitives;
+
+namespace SixLabors.ImageSharp.Processing.Processors.Overlays
+{
+ ///
+ /// An that applies a radial glow effect an .
+ ///
+ /// The pixel format.
+ internal class GlowProcessor : ImageProcessor
+ where TPixel : struct, IPixel
+ {
+ private readonly PixelBlender blender;
+
+ private readonly GlowProcessor definition;
+
+ public GlowProcessor(GlowProcessor definition)
+ {
+ this.definition = definition;
+ this.blender = PixelOperations.Instance.GetPixelBlender(definition.GraphicsOptions);
+ }
+
+ ///
+ protected override void OnFrameApply(
+ ImageFrame source,
+ Rectangle sourceRectangle,
+ Configuration configuration)
+ {
+ // TODO: can we simplify the rectangle calculation?
+ int startY = sourceRectangle.Y;
+ int endY = sourceRectangle.Bottom;
+ int startX = sourceRectangle.X;
+ int endX = sourceRectangle.Right;
+ TPixel glowColor = this.definition.GlowColor.ToPixel();
+ Vector2 center = Rectangle.Center(sourceRectangle);
+
+ float finalRadius = this.definition.Radius.Calculate(source.Size());
+
+ float maxDistance = finalRadius > 0
+ ? MathF.Min(finalRadius, sourceRectangle.Width * .5F)
+ : sourceRectangle.Width * .5F;
+
+ // 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);
+
+ // Reset offset if necessary.
+ if (minX > 0)
+ {
+ startX = 0;
+ }
+
+ if (minY > 0)
+ {
+ startY = 0;
+ }
+
+ int width = maxX - minX;
+ int offsetX = minX - startX;
+
+ var workingRect = Rectangle.FromLTRB(minX, minY, maxX, maxY);
+
+ float blendPercentage = this.definition.GraphicsOptions.BlendPercentage;
+
+ using (IMemoryOwner rowColors = source.MemoryAllocator.Allocate(width))
+ {
+ rowColors.GetSpan().Fill(glowColor);
+
+ ParallelHelper.IterateRowsWithTempBuffer(
+ workingRect,
+ configuration,
+ (rows, amounts) =>
+ {
+ Span amountsSpan = amounts.Span;
+
+ for (int y = rows.Min; y < rows.Max; y++)
+ {
+ int offsetY = y - startY;
+
+ for (int i = 0; i < width; i++)
+ {
+ float distance = Vector2.Distance(center, new Vector2(i + offsetX, offsetY));
+ amountsSpan[i] =
+ (blendPercentage * (1 - (.95F * (distance / maxDistance)))).Clamp(0, 1);
+ }
+
+ Span destination = source.GetPixelRowSpan(offsetY).Slice(offsetX, width);
+
+ this.blender.Blend(
+ source.Configuration,
+ destination,
+ destination,
+ rowColors.GetSpan(),
+ amountsSpan);
+ }
+ });
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor.cs b/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor.cs
index a8fa1d65c..66bf9f1af 100644
--- a/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor.cs
+++ b/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor.cs
@@ -1,63 +1,48 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
-using System;
-using System.Buffers;
-using System.Numerics;
-using System.Threading.Tasks;
-using SixLabors.ImageSharp.Advanced;
-using SixLabors.ImageSharp.Memory;
-using SixLabors.ImageSharp.ParallelUtils;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Primitives;
-using SixLabors.Memory;
-using SixLabors.Primitives;
namespace SixLabors.ImageSharp.Processing.Processors.Overlays
{
///
- /// An that applies a radial vignette effect to an .
+ /// Defines a radial vignette effect applicable to an .
///
- /// The pixel format.
- internal class VignetteProcessor : ImageProcessor
- where TPixel : struct, IPixel
+ public sealed class VignetteProcessor : IImageProcessor
{
- private readonly PixelBlender blender;
-
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
/// The color of the vignette.
- public VignetteProcessor(TPixel color)
+ public VignetteProcessor(Color color)
: this(color, GraphicsOptions.Default)
{
}
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
/// The color of the vignette.
/// The options effecting blending and composition.
- public VignetteProcessor(TPixel color, GraphicsOptions options)
+ public VignetteProcessor(Color color, GraphicsOptions options)
{
this.VignetteColor = color;
this.GraphicsOptions = options;
- this.blender = PixelOperations.Instance.GetPixelBlender(options);
}
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
/// The color of the vignette.
/// The x-radius.
/// The y-radius.
/// The options effecting blending and composition.
- public VignetteProcessor(TPixel color, ValueSize radiusX, ValueSize radiusY, GraphicsOptions options)
+ internal VignetteProcessor(Color color, ValueSize radiusX, ValueSize radiusY, GraphicsOptions options)
{
this.VignetteColor = color;
this.RadiusX = radiusX;
this.RadiusY = radiusY;
- this.blender = PixelOperations.Instance.GetPixelBlender(options);
this.GraphicsOptions = options;
}
@@ -67,94 +52,25 @@ namespace SixLabors.ImageSharp.Processing.Processors.Overlays
public GraphicsOptions GraphicsOptions { get; }
///
- /// Gets or sets the vignette color to apply.
+ /// Gets the vignette color to apply.
///
- public TPixel VignetteColor { get; set; }
+ public Color VignetteColor { get; }
///
- /// Gets or sets the the x-radius.
+ /// Gets the the x-radius.
///
- public ValueSize RadiusX { get; set; }
+ internal ValueSize RadiusX { get; }
///
- /// Gets or sets the the y-radius.
+ /// Gets the the y-radius.
///
- public ValueSize RadiusY { get; set; }
+ internal ValueSize RadiusY { get; }
- ///
- protected override void OnFrameApply(ImageFrame source, Rectangle sourceRectangle, Configuration configuration)
+ ///
+ public IImageProcessor CreatePixelSpecificProcessor()
+ where TPixel : struct, IPixel
{
- int startY = sourceRectangle.Y;
- int endY = sourceRectangle.Bottom;
- int startX = sourceRectangle.X;
- int endX = sourceRectangle.Right;
- TPixel vignetteColor = this.VignetteColor;
- Vector2 centre = Rectangle.Center(sourceRectangle);
-
- Size sourceSize = source.Size();
- float finalRadiusX = this.RadiusX.Calculate(sourceSize);
- float finalRadiusY = this.RadiusY.Calculate(sourceSize);
- float rX = finalRadiusX > 0 ? MathF.Min(finalRadiusX, sourceRectangle.Width * .5F) : sourceRectangle.Width * .5F;
- float rY = finalRadiusY > 0 ? MathF.Min(finalRadiusY, sourceRectangle.Height * .5F) : sourceRectangle.Height * .5F;
- float maxDistance = MathF.Sqrt((rX * rX) + (rY * rY));
-
- // 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);
-
- // Reset offset if necessary.
- if (minX > 0)
- {
- startX = 0;
- }
-
- if (minY > 0)
- {
- startY = 0;
- }
-
- int width = maxX - minX;
- int offsetX = minX - startX;
-
- var workingRect = Rectangle.FromLTRB(minX, minY, maxX, maxY);
-
- using (IMemoryOwner rowColors = source.MemoryAllocator.Allocate(width))
- {
- rowColors.GetSpan().Fill(vignetteColor);
-
- ParallelHelper.IterateRowsWithTempBuffer(
- workingRect,
- configuration,
- (rows, amounts) =>
- {
- Span amountsSpan = amounts.Span;
-
- for (int y = rows.Min; y < rows.Max; y++)
- {
- int offsetY = y - startY;
-
- for (int i = 0; i < width; i++)
- {
- float distance = Vector2.Distance(centre, new Vector2(i + offsetX, offsetY));
- amountsSpan[i] =
- (this.GraphicsOptions.BlendPercentage * (.9F * (distance / maxDistance))).Clamp(
- 0,
- 1);
- }
-
- Span destination = source.GetPixelRowSpan(offsetY).Slice(offsetX, width);
-
- this.blender.Blend(
- source.Configuration,
- destination,
- destination,
- rowColors.GetSpan(),
- amountsSpan);
- }
- });
- }
+ return new VignetteProcessor(this);
}
}
}
\ No newline at end of file
diff --git a/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor{TPixel}.cs
new file mode 100644
index 000000000..78c3cec5e
--- /dev/null
+++ b/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor{TPixel}.cs
@@ -0,0 +1,114 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+using System;
+using System.Buffers;
+using System.Numerics;
+
+using SixLabors.ImageSharp.Advanced;
+using SixLabors.ImageSharp.Memory;
+using SixLabors.ImageSharp.ParallelUtils;
+using SixLabors.ImageSharp.PixelFormats;
+using SixLabors.Primitives;
+
+namespace SixLabors.ImageSharp.Processing.Processors.Overlays
+{
+ ///
+ /// An that applies a radial vignette effect to an .
+ ///
+ /// The pixel format.
+ internal class VignetteProcessor : ImageProcessor
+ where TPixel : struct, IPixel
+ {
+ private readonly PixelBlender blender;
+
+ private readonly VignetteProcessor definition;
+
+ public VignetteProcessor(VignetteProcessor definition)
+ {
+ this.definition = definition;
+ this.blender = PixelOperations.Instance.GetPixelBlender(definition.GraphicsOptions);
+ }
+
+ ///
+ protected override void OnFrameApply(
+ ImageFrame source,
+ Rectangle sourceRectangle,
+ Configuration configuration)
+ {
+ int startY = sourceRectangle.Y;
+ int endY = sourceRectangle.Bottom;
+ int startX = sourceRectangle.X;
+ int endX = sourceRectangle.Right;
+ TPixel vignetteColor = this.definition.VignetteColor.ToPixel();
+ Vector2 centre = Rectangle.Center(sourceRectangle);
+
+ Size sourceSize = source.Size();
+ float finalRadiusX = this.definition.RadiusX.Calculate(sourceSize);
+ float finalRadiusY = this.definition.RadiusY.Calculate(sourceSize);
+ float rX = finalRadiusX > 0
+ ? MathF.Min(finalRadiusX, sourceRectangle.Width * .5F)
+ : sourceRectangle.Width * .5F;
+ float rY = finalRadiusY > 0
+ ? MathF.Min(finalRadiusY, sourceRectangle.Height * .5F)
+ : sourceRectangle.Height * .5F;
+ float maxDistance = MathF.Sqrt((rX * rX) + (rY * rY));
+
+ // 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);
+
+ // Reset offset if necessary.
+ if (minX > 0)
+ {
+ startX = 0;
+ }
+
+ if (minY > 0)
+ {
+ startY = 0;
+ }
+
+ int width = maxX - minX;
+ int offsetX = minX - startX;
+
+ var workingRect = Rectangle.FromLTRB(minX, minY, maxX, maxY);
+ float blendPercentage = this.definition.GraphicsOptions.BlendPercentage;
+
+ using (IMemoryOwner rowColors = source.MemoryAllocator.Allocate(width))
+ {
+ rowColors.GetSpan().Fill(vignetteColor);
+
+ ParallelHelper.IterateRowsWithTempBuffer(
+ workingRect,
+ configuration,
+ (rows, amounts) =>
+ {
+ Span amountsSpan = amounts.Span;
+
+ for (int y = rows.Min; y < rows.Max; y++)
+ {
+ int offsetY = y - startY;
+
+ for (int i = 0; i < width; i++)
+ {
+ float distance = Vector2.Distance(centre, new Vector2(i + offsetX, offsetY));
+ amountsSpan[i] = (blendPercentage * (.9F * (distance / maxDistance))).Clamp(0, 1);
+ }
+
+ Span destination = source.GetPixelRowSpan(offsetY).Slice(offsetX, width);
+
+ this.blender.Blend(
+ source.Configuration,
+ destination,
+ destination,
+ rowColors.GetSpan(),
+ amountsSpan);
+ }
+ });
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ImageSharp/Processing/VignetteExtensions.cs b/src/ImageSharp/Processing/VignetteExtensions.cs
index 63cdee3f8..74a59d3e1 100644
--- a/src/ImageSharp/Processing/VignetteExtensions.cs
+++ b/src/ImageSharp/Processing/VignetteExtensions.cs
@@ -1,7 +1,6 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
-using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Primitives;
using SixLabors.ImageSharp.Processing.Processors.Overlays;
using SixLabors.Primitives;
@@ -9,7 +8,7 @@ using SixLabors.Primitives;
namespace SixLabors.ImageSharp.Processing
{
///
- /// Defines extensions that allow the application of a radial glow to an
+ /// Defines extensions that allow the application of a radial glow to an
/// using Mutate/Clone.
///
public static class VignetteExtensions
@@ -17,53 +16,47 @@ namespace SixLabors.ImageSharp.Processing
///
/// Applies a radial vignette effect to an image.
///
- /// The pixel format.
/// The image this method extends.
/// The to allow chaining of operations.
- public static IImageProcessingContext Vignette(this IImageProcessingContext source)
- where TPixel : struct, IPixel
- => Vignette(source, GraphicsOptions.Default);
+ public static IImageProcessingContext Vignette(this IImageProcessingContext source) =>
+ Vignette(source, GraphicsOptions.Default);
///
/// Applies a radial vignette effect to an image.
///
- /// The pixel format.
/// The image this method extends.
/// The color to set as the vignette.
/// The to allow chaining of operations.
- public static IImageProcessingContext Vignette(this IImageProcessingContext source, TPixel color)
- where TPixel : struct, IPixel
- => Vignette(source, GraphicsOptions.Default, color);
+ public static IImageProcessingContext Vignette(this IImageProcessingContext source, Color color) =>
+ Vignette(source, GraphicsOptions.Default, color);
///
/// Applies a radial vignette effect to an image.
///
- /// The pixel format.
/// The image this method extends.
/// The the x-radius.
/// The the y-radius.
/// The to allow chaining of operations.
- public static IImageProcessingContext Vignette(this IImageProcessingContext source, float radiusX, float radiusY)
- where TPixel : struct, IPixel
- => Vignette(source, GraphicsOptions.Default, radiusX, radiusY);
+ public static IImageProcessingContext Vignette(
+ this IImageProcessingContext source,
+ float radiusX,
+ float radiusY) =>
+ Vignette(source, GraphicsOptions.Default, radiusX, radiusY);
///
/// Applies a radial vignette effect to an image.
///
- /// The pixel format.
/// The image this method extends.
///
/// The structure that specifies the portion of the image object to alter.
///
/// The to allow chaining of operations.
- public static IImageProcessingContext Vignette(this IImageProcessingContext source, Rectangle rectangle)
- where TPixel : struct, IPixel
- => Vignette(source, GraphicsOptions.Default, rectangle);
+ public static IImageProcessingContext Vignette(this IImageProcessingContext source, Rectangle rectangle) =>
+ Vignette(source, GraphicsOptions.Default, rectangle);
///
/// Applies a radial vignette effect to an image.
///
- /// The pixel format.
/// The image this method extends.
/// The color to set as the vignette.
/// The the x-radius.
@@ -72,64 +65,82 @@ namespace SixLabors.ImageSharp.Processing
/// The structure that specifies the portion of the image object to alter.
///
/// The to allow chaining of operations.
- public static IImageProcessingContext Vignette(this IImageProcessingContext source, TPixel color, float radiusX, float radiusY, Rectangle rectangle)
- where TPixel : struct, IPixel
- => source.Vignette(GraphicsOptions.Default, color, radiusX, radiusY, rectangle);
+ public static IImageProcessingContext Vignette(
+ this IImageProcessingContext source,
+ Color color,
+ float radiusX,
+ float radiusY,
+ Rectangle rectangle) =>
+ source.Vignette(GraphicsOptions.Default, color, radiusX, radiusY, rectangle);
///
/// Applies a radial vignette effect to an image.
///
- /// The pixel format.
/// The image this method extends.
/// The options effecting pixel blending.
/// The to allow chaining of operations.
- public static IImageProcessingContext Vignette(this IImageProcessingContext source, GraphicsOptions options)
- where TPixel : struct, IPixel
- => source.VignetteInternal(options, NamedColors.Black, ValueSize.PercentageOfWidth(.5f), ValueSize.PercentageOfHeight(.5f));
+ public static IImageProcessingContext Vignette(this IImageProcessingContext source, GraphicsOptions options) =>
+ source.VignetteInternal(
+ options,
+ Color.Black,
+ ValueSize.PercentageOfWidth(.5f),
+ ValueSize.PercentageOfHeight(.5f));
///
/// Applies a radial vignette effect to an image.
///
- /// The pixel format.
/// The image this method extends.
/// The options effecting pixel blending.
/// The color to set as the vignette.
/// The to allow chaining of operations.
- public static IImageProcessingContext Vignette(this IImageProcessingContext source, GraphicsOptions options, TPixel color)
- where TPixel : struct, IPixel
- => source.VignetteInternal(options, color, ValueSize.PercentageOfWidth(.5f), ValueSize.PercentageOfHeight(.5f));
+ public static IImageProcessingContext Vignette(
+ this IImageProcessingContext source,
+ GraphicsOptions options,
+ Color color) =>
+ source.VignetteInternal(
+ options,
+ color,
+ ValueSize.PercentageOfWidth(.5f),
+ ValueSize.PercentageOfHeight(.5f));
///
/// Applies a radial vignette effect to an image.
///
- /// The pixel format.
/// The image this method extends.
/// The options effecting pixel blending.
/// The the x-radius.
/// The the y-radius.
/// The to allow chaining of operations.
- public static IImageProcessingContext Vignette(this IImageProcessingContext source, GraphicsOptions options, float radiusX, float radiusY)
- where TPixel : struct, IPixel
- => source.VignetteInternal(options, NamedColors.Black, radiusX, radiusY);
+ public static IImageProcessingContext Vignette(
+ this IImageProcessingContext source,
+ GraphicsOptions options,
+ float radiusX,
+ float radiusY) =>
+ source.VignetteInternal(options, Color.Black, radiusX, radiusY);
///
/// Applies a radial vignette effect to an image.
///
- /// The pixel format.
/// The image this method extends.
/// The options effecting pixel blending.
///
/// The structure that specifies the portion of the image object to alter.
///
/// The to allow chaining of operations.
- public static IImageProcessingContext Vignette(this IImageProcessingContext source, GraphicsOptions options, Rectangle rectangle)
- where TPixel : struct, IPixel
- => source.VignetteInternal(options, NamedColors.Black, ValueSize.PercentageOfWidth(.5f), ValueSize.PercentageOfHeight(.5f), rectangle);
+ public static IImageProcessingContext Vignette(
+ this IImageProcessingContext source,
+ GraphicsOptions options,
+ Rectangle rectangle) =>
+ source.VignetteInternal(
+ options,
+ Color.Black,
+ ValueSize.PercentageOfWidth(.5f),
+ ValueSize.PercentageOfHeight(.5f),
+ rectangle);
///
/// Applies a radial vignette effect to an image.
///
- /// The pixel format.
/// The image this method extends.
/// The options effecting pixel blending.
/// The color to set as the vignette.
@@ -139,16 +150,30 @@ namespace SixLabors.ImageSharp.Processing
/// The structure that specifies the portion of the image object to alter.
///
/// The to allow chaining of operations.
- public static IImageProcessingContext Vignette(this IImageProcessingContext source, GraphicsOptions options, TPixel color, float radiusX, float radiusY, Rectangle rectangle)
- where TPixel : struct, IPixel
- => source.VignetteInternal(options, color, radiusX, radiusY, rectangle);
+ public static IImageProcessingContext Vignette(
+ this IImageProcessingContext source,
+ GraphicsOptions options,
+ Color color,
+ float radiusX,
+ float radiusY,
+ Rectangle rectangle) =>
+ source.VignetteInternal(options, color, radiusX, radiusY, rectangle);
- private static IImageProcessingContext VignetteInternal(this IImageProcessingContext source, GraphicsOptions options, TPixel color, ValueSize radiusX, ValueSize radiusY, Rectangle rectangle)
- where TPixel : struct, IPixel
- => source.ApplyProcessor(new VignetteProcessor(color, radiusX, radiusY, options), rectangle);
+ private static IImageProcessingContext VignetteInternal(
+ this IImageProcessingContext source,
+ GraphicsOptions options,
+ Color color,
+ ValueSize radiusX,
+ ValueSize radiusY,
+ Rectangle rectangle) =>
+ source.ApplyProcessor(new VignetteProcessor(color, radiusX, radiusY, options), rectangle);
- private static IImageProcessingContext VignetteInternal(this IImageProcessingContext source, GraphicsOptions options, TPixel color, ValueSize radiusX, ValueSize radiusY)
- where TPixel : struct, IPixel
- => source.ApplyProcessor(new VignetteProcessor(color, radiusX, radiusY, options));
+ private static IImageProcessingContext VignetteInternal(
+ this IImageProcessingContext source,
+ GraphicsOptions options,
+ Color color,
+ ValueSize radiusX,
+ ValueSize radiusY) =>
+ source.ApplyProcessor(new VignetteProcessor(color, radiusX, radiusY, options));
}
}
\ No newline at end of file
diff --git a/tests/ImageSharp.Benchmarks/Samplers/Glow.cs b/tests/ImageSharp.Benchmarks/Samplers/Glow.cs
index 15b82e022..29f69cdd5 100644
--- a/tests/ImageSharp.Benchmarks/Samplers/Glow.cs
+++ b/tests/ImageSharp.Benchmarks/Samplers/Glow.cs
@@ -20,14 +20,14 @@ namespace SixLabors.ImageSharp.Benchmarks
public class Glow : BenchmarkBase
{
- private GlowProcessor bulk;
+ private GlowProcessor bulk;
private GlowProcessorParallel parallel;
[GlobalSetup]
public void Setup()
{
- this.bulk = new GlowProcessor(NamedColors.Beige, 800 * .5f, GraphicsOptions.Default);
+ this.bulk = new GlowProcessor(Color.Beige, 800 * .5f, GraphicsOptions.Default);
this.parallel = new GlowProcessorParallel(NamedColors.Beige) { Radius = 800 * .5f, };
}
diff --git a/tests/ImageSharp.Tests/Drawing/BeziersTests.cs b/tests/ImageSharp.Tests/Drawing/BeziersTests.cs
index 69b2098dc..cc8f27f3a 100644
--- a/tests/ImageSharp.Tests/Drawing/BeziersTests.cs
+++ b/tests/ImageSharp.Tests/Drawing/BeziersTests.cs
@@ -19,8 +19,9 @@ namespace SixLabors.ImageSharp.Tests.Drawing
string path = TestEnvironment.CreateOutputDirectory("Drawing", "BezierLine");
using (var image = new Image(500, 500))
{
+ image.Mutate(x => x.BackgroundColor(Color.Blue));
image.Mutate(
- x => x.BackgroundColor(Rgba32.Blue).DrawBeziers(
+ x => x.DrawBeziers(
Rgba32.HotPink,
5,
new SixLabors.Primitives.PointF[]
@@ -56,8 +57,9 @@ namespace SixLabors.ImageSharp.Tests.Drawing
using (var image = new Image(500, 500))
{
+ image.Mutate(x => x.BackgroundColor(Color.Blue));
image.Mutate(
- x => x.BackgroundColor(Rgba32.Blue).DrawBeziers(
+ x => x.DrawBeziers(
color,
10,
new SixLabors.Primitives.PointF[]
diff --git a/tests/ImageSharp.Tests/Drawing/DrawImageTest.cs b/tests/ImageSharp.Tests/Drawing/DrawImageTest.cs
index ee04d4388..54b04390e 100644
--- a/tests/ImageSharp.Tests/Drawing/DrawImageTest.cs
+++ b/tests/ImageSharp.Tests/Drawing/DrawImageTest.cs
@@ -80,7 +80,7 @@ namespace SixLabors.ImageSharp.Tests
// Apply a background color so we can see the translation.
blend.Mutate(x => x.Transform(builder));
- blend.Mutate(x => x.BackgroundColor(NamedColors.HotPink));
+ blend.Mutate(x => x.BackgroundColor(Color.HotPink));
// Lets center the matrix so we can tell whether any cut-off issues we may have belong to the drawing processor
var position = new Point((image.Width - blend.Width) / 2, (image.Height - blend.Height) / 2);
diff --git a/tests/ImageSharp.Tests/Drawing/DrawPathTests.cs b/tests/ImageSharp.Tests/Drawing/DrawPathTests.cs
index 0d791fbd2..d2485f334 100644
--- a/tests/ImageSharp.Tests/Drawing/DrawPathTests.cs
+++ b/tests/ImageSharp.Tests/Drawing/DrawPathTests.cs
@@ -30,8 +30,9 @@ namespace SixLabors.ImageSharp.Tests.Drawing
new Vector2(10, 400));
var p = new Path(linerSegemnt, bazierSegment);
-
- image.Mutate(x => x.BackgroundColor(Rgba32.Blue).Draw(Rgba32.HotPink, 5, p));
+
+ image.Mutate(x => x.BackgroundColor(Rgba32.Blue));
+ image.Mutate(x => x.Draw(Rgba32.HotPink, 5, p));
image.Save($"{path}/Simple.png");
Buffer2D sourcePixels = image.GetRootFramePixelBuffer();
@@ -67,7 +68,8 @@ namespace SixLabors.ImageSharp.Tests.Drawing
using (var image = new Image(500, 500))
{
- image.Mutate(x => x.BackgroundColor(Rgba32.Blue).Draw(color, 10, p));
+ image.Mutate(x => x.BackgroundColor(Rgba32.Blue));
+ image.Mutate(x => x.Draw(color, 10, p));
image.Save($"{path}/Opacity.png");
//shift background color towards forground color by the opacity amount
diff --git a/tests/ImageSharp.Tests/Drawing/LineComplexPolygonTests.cs b/tests/ImageSharp.Tests/Drawing/LineComplexPolygonTests.cs
index d827975c7..06961bec4 100644
--- a/tests/ImageSharp.Tests/Drawing/LineComplexPolygonTests.cs
+++ b/tests/ImageSharp.Tests/Drawing/LineComplexPolygonTests.cs
@@ -31,7 +31,8 @@ namespace SixLabors.ImageSharp.Tests.Drawing
using (var image = new Image(500, 500))
{
- image.Mutate(x => x.BackgroundColor(Rgba32.Blue).Draw(Rgba32.HotPink, 5, simplePath.Clip(hole1)));
+ image.Mutate(x => x.BackgroundColor(Rgba32.Blue));
+ image.Mutate(x => x.Draw(Rgba32.HotPink, 5, simplePath.Clip(hole1)));
image.Save($"{path}/Simple.png");
Buffer2D sourcePixels = image.GetRootFramePixelBuffer();
@@ -73,7 +74,8 @@ namespace SixLabors.ImageSharp.Tests.Drawing
using (var image = new Image(500, 500))
{
- image.Mutate(x => x.BackgroundColor(Rgba32.Blue).Draw(Rgba32.HotPink, 5, simplePath.Clip(hole1)));
+ image.Mutate(x => x.BackgroundColor(Rgba32.Blue));
+ image.Mutate(x => x.Draw(Rgba32.HotPink, 5, simplePath.Clip(hole1)));
image.Save($"{path}/SimpleVanishHole.png");
Buffer2D sourcePixels = image.GetRootFramePixelBuffer();
@@ -113,7 +115,8 @@ namespace SixLabors.ImageSharp.Tests.Drawing
using (var image = new Image(500, 500))
{
- image.Mutate(x => x.BackgroundColor(Rgba32.Blue).Draw(Rgba32.HotPink, 5, simplePath.Clip(hole1)));
+ image.Mutate(x => x.BackgroundColor(Rgba32.Blue));
+ image.Mutate(x => x.Draw(Rgba32.HotPink, 5, simplePath.Clip(hole1)));
image.Save($"{path}/SimpleOverlapping.png");
Buffer2D sourcePixels = image.GetRootFramePixelBuffer();
@@ -147,9 +150,8 @@ namespace SixLabors.ImageSharp.Tests.Drawing
using (var image = new Image(500, 500))
{
- image.Mutate(x => x
- .BackgroundColor(Rgba32.Blue)
- .Draw(Pens.Dash(Rgba32.HotPink, 5), simplePath.Clip(hole1)));
+ image.Mutate(x => x.BackgroundColor(Rgba32.Blue));
+ image.Mutate(x => x.Draw(Pens.Dash(Rgba32.HotPink, 5), simplePath.Clip(hole1)));
image.Save($"{path}/Dashed.png");
}
}
@@ -171,7 +173,8 @@ namespace SixLabors.ImageSharp.Tests.Drawing
using (var image = new Image(500, 500))
{
- image.Mutate(x => x.BackgroundColor(Rgba32.Blue).Draw(color, 5, simplePath.Clip(hole1)));
+ image.Mutate(x => x.BackgroundColor(Rgba32.Blue));
+ image.Mutate(x => x.Draw(color, 5, simplePath.Clip(hole1)));
image.Save($"{path}/Opacity.png");
//shift background color towards forground color by the opacity amount
diff --git a/tests/ImageSharp.Tests/Drawing/LineTests.cs b/tests/ImageSharp.Tests/Drawing/LineTests.cs
index 43dec547e..1cc0fd1a4 100644
--- a/tests/ImageSharp.Tests/Drawing/LineTests.cs
+++ b/tests/ImageSharp.Tests/Drawing/LineTests.cs
@@ -19,8 +19,9 @@ namespace SixLabors.ImageSharp.Tests.Drawing
string path = TestEnvironment.CreateOutputDirectory("Drawing", "Lines");
using (var image = new Image(500, 500))
{
+ image.Mutate(x => x.BackgroundColor(Rgba32.Blue));
image.Mutate(
- x => x.BackgroundColor(Rgba32.Blue).DrawLines(
+ x => x.DrawLines(
Rgba32.HotPink,
5,
new Vector2(10, 10),
@@ -43,8 +44,9 @@ namespace SixLabors.ImageSharp.Tests.Drawing
string path = TestEnvironment.CreateOutputDirectory("Drawing", "Lines");
using (var image = new Image(500, 500))
{
+ image.Mutate(x => x.BackgroundColor(Rgba32.Blue));
image.Mutate(
- x => x.BackgroundColor(Rgba32.Blue).DrawLines(
+ x => x.DrawLines(
new GraphicsOptions(false),
Rgba32.HotPink,
5,
@@ -68,9 +70,8 @@ namespace SixLabors.ImageSharp.Tests.Drawing
string path = TestEnvironment.CreateOutputDirectory("Drawing", "Lines");
using (var image = new Image(500, 500))
{
- image.Mutate(x => x
- .BackgroundColor(Rgba32.Blue)
- .DrawLines(Pens.Dash(Rgba32.HotPink, 5),
+ image.Mutate(x => x.BackgroundColor(Rgba32.Blue));
+ image.Mutate(x => x.DrawLines(Pens.Dash(Rgba32.HotPink, 5),
new SixLabors.Primitives.PointF[] {
new Vector2(10, 10),
new Vector2(200, 150),
@@ -86,9 +87,8 @@ namespace SixLabors.ImageSharp.Tests.Drawing
string path = TestEnvironment.CreateOutputDirectory("Drawing", "Lines");
using (var image = new Image(500, 500))
{
- image.Mutate(x => x
- .BackgroundColor(Rgba32.Blue)
- .DrawLines(Pens.Dot(Rgba32.HotPink, 5),
+ image.Mutate(x => x.BackgroundColor(Rgba32.Blue));
+ image.Mutate(x => x.DrawLines(Pens.Dot(Rgba32.HotPink, 5),
new SixLabors.Primitives.PointF[] {
new Vector2(10, 10),
new Vector2(200, 150),
@@ -104,9 +104,8 @@ namespace SixLabors.ImageSharp.Tests.Drawing
string path = TestEnvironment.CreateOutputDirectory("Drawing", "Lines");
using (var image = new Image(500, 500))
{
- image.Mutate(x => x
- .BackgroundColor(Rgba32.Blue)
- .DrawLines(Pens.DashDot(Rgba32.HotPink, 5),
+ image.Mutate(x => x.BackgroundColor(Rgba32.Blue));
+ image.Mutate(x => x.DrawLines(Pens.DashDot(Rgba32.HotPink, 5),
new SixLabors.Primitives.PointF[] {
new Vector2(10, 10),
new Vector2(200, 150),
@@ -122,9 +121,9 @@ namespace SixLabors.ImageSharp.Tests.Drawing
string path = TestEnvironment.CreateOutputDirectory("Drawing", "Lines");
var image = new Image(500, 500);
- image.Mutate(x => x
- .BackgroundColor(Rgba32.Blue)
- .DrawLines(Pens.DashDotDot(Rgba32.HotPink, 5), new SixLabors.Primitives.PointF[] {
+ image.Mutate(x => x.BackgroundColor(Rgba32.Blue));
+ image.Mutate(x => x.DrawLines(Pens.DashDotDot(Rgba32.HotPink, 5),
+ new SixLabors.Primitives.PointF[] {
new Vector2(10, 10),
new Vector2(200, 150),
new Vector2(50, 300)
@@ -141,8 +140,9 @@ namespace SixLabors.ImageSharp.Tests.Drawing
var image = new Image(500, 500);
+ image.Mutate(x => x.BackgroundColor(Rgba32.Blue));
image.Mutate(
- x => x.BackgroundColor(Rgba32.Blue).DrawLines(
+ x => x.DrawLines(
color,
10,
new Vector2(10, 10),
@@ -169,8 +169,9 @@ namespace SixLabors.ImageSharp.Tests.Drawing
var image = new Image