diff --git a/ImageSharp.sln b/ImageSharp.sln
index d4a0419ee..227512cd1 100644
--- a/ImageSharp.sln
+++ b/ImageSharp.sln
@@ -64,8 +64,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{815C0625-CD3
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ImageSharp", "src\ImageSharp\ImageSharp.csproj", "{2AA31A1F-142C-43F4-8687-09ABCA4B3A26}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ImageSharp.Drawing", "src\ImageSharp.Drawing\ImageSharp.Drawing.csproj", "{2E33181E-6E28-4662-A801-E2E7DC206029}"
-EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{56801022-D71A-4FBE-BC5B-CBA08E2284EC}"
ProjectSection(SolutionItems) = preProject
tests\Directory.Build.props = tests\Directory.Build.props
@@ -378,18 +376,6 @@ Global
{2AA31A1F-142C-43F4-8687-09ABCA4B3A26}.Release|x64.Build.0 = Release|Any CPU
{2AA31A1F-142C-43F4-8687-09ABCA4B3A26}.Release|x86.ActiveCfg = Release|Any CPU
{2AA31A1F-142C-43F4-8687-09ABCA4B3A26}.Release|x86.Build.0 = Release|Any CPU
- {2E33181E-6E28-4662-A801-E2E7DC206029}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {2E33181E-6E28-4662-A801-E2E7DC206029}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {2E33181E-6E28-4662-A801-E2E7DC206029}.Debug|x64.ActiveCfg = Debug|Any CPU
- {2E33181E-6E28-4662-A801-E2E7DC206029}.Debug|x64.Build.0 = Debug|Any CPU
- {2E33181E-6E28-4662-A801-E2E7DC206029}.Debug|x86.ActiveCfg = Debug|Any CPU
- {2E33181E-6E28-4662-A801-E2E7DC206029}.Debug|x86.Build.0 = Debug|Any CPU
- {2E33181E-6E28-4662-A801-E2E7DC206029}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {2E33181E-6E28-4662-A801-E2E7DC206029}.Release|Any CPU.Build.0 = Release|Any CPU
- {2E33181E-6E28-4662-A801-E2E7DC206029}.Release|x64.ActiveCfg = Release|Any CPU
- {2E33181E-6E28-4662-A801-E2E7DC206029}.Release|x64.Build.0 = Release|Any CPU
- {2E33181E-6E28-4662-A801-E2E7DC206029}.Release|x86.ActiveCfg = Release|Any CPU
- {2E33181E-6E28-4662-A801-E2E7DC206029}.Release|x86.Build.0 = Release|Any CPU
{EA3000E9-2A91-4EC4-8A68-E566DEBDC4F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EA3000E9-2A91-4EC4-8A68-E566DEBDC4F6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EA3000E9-2A91-4EC4-8A68-E566DEBDC4F6}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -434,7 +420,6 @@ Global
{FBE8C1AD-5AEC-4514-9B64-091D8E145865} = {1799C43E-5C54-4A8F-8D64-B1475241DB0D}
{2B02E303-7CC6-4E15-97EE-DBE86B287553} = {E919DF0B-2607-4462-8FC0-5C98FE50F8C9}
{2AA31A1F-142C-43F4-8687-09ABCA4B3A26} = {815C0625-CD3D-440F-9F80-2D83856AB7AE}
- {2E33181E-6E28-4662-A801-E2E7DC206029} = {815C0625-CD3D-440F-9F80-2D83856AB7AE}
{D4C5EC58-F8E6-4636-B9EE-C99D2578E5C6} = {56801022-D71A-4FBE-BC5B-CBA08E2284EC}
{FA55F5DE-11A6-487D-ABA4-BC93A02717DD} = {56801022-D71A-4FBE-BC5B-CBA08E2284EC}
{9DA226A1-8656-49A8-A58A-A8B5C081AD66} = {FA55F5DE-11A6-487D-ABA4-BC93A02717DD}
diff --git a/appveyor.yml b/appveyor.yml
index 2cc5182d3..2588b8065 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -55,7 +55,6 @@ test_script:
after_test:
- cmd: appveyor PushArtifact "artifacts\SixLabors.ImageSharp.%APPVEYOR_BUILD_VERSION%.nupkg"
- - cmd: appveyor PushArtifact "artifacts\SixLabors.ImageSharp.Drawing.%APPVEYOR_BUILD_VERSION%.nupkg"
deploy:
# MyGet Deployment for builds & releases
@@ -66,4 +65,4 @@ deploy:
secure: V/lEHP0UeMWIpWd0fiNlY2IgbCnJKQlGdRksECdJbOBdaE20Fl0RNL7WyqHe02o4
artifact: /.*\.nupkg/
on:
- branch: master
\ No newline at end of file
+ branch: master
diff --git a/build.ps1 b/build.ps1
index 215b55117..4584ebc60 100644
--- a/build.ps1
+++ b/build.ps1
@@ -117,6 +117,3 @@ if ($LASTEXITCODE ){ Exit $LASTEXITCODE }
Write-Host "Packaging projects"
dotnet pack ./src/ImageSharp/ -c Release --output ../../artifacts --no-build /p:packageversion=$version
if ($LASTEXITCODE ){ Exit $LASTEXITCODE }
-
-dotnet pack ./src/ImageSharp.Drawing/ -c Release --output ../../artifacts --no-build /p:packageversion=$version
-if ($LASTEXITCODE ){ Exit $LASTEXITCODE }
diff --git a/src/ImageSharp.Drawing/Common/Extensions/GraphicsOptionsExtensions.cs b/src/ImageSharp.Drawing/Common/Extensions/GraphicsOptionsExtensions.cs
deleted file mode 100644
index c32d0a46e..000000000
--- a/src/ImageSharp.Drawing/Common/Extensions/GraphicsOptionsExtensions.cs
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System.Numerics;
-using SixLabors.ImageSharp.PixelFormats;
-
-namespace SixLabors.ImageSharp
-{
- ///
- /// Extensions methods fpor the class.
- ///
- internal static class GraphicsOptionsExtensions
- {
- ///
- /// Evaluates if a given SOURCE color can completely replace a BACKDROP color given the current blending and composition settings.
- ///
- /// The graphics options.
- /// The source color.
- /// true if the color can be considered opaque
- ///
- /// Blending and composition is an expensive operation, in some cases, like
- /// filling with a solid color, the blending can be avoided by a plain color replacement.
- /// This method can be useful for such processors to select the fast path.
- ///
- public static bool IsOpaqueColorWithoutBlending(this GraphicsOptions options, Color color)
- {
- if (options.ColorBlendingMode != PixelColorBlendingMode.Normal)
- {
- return false;
- }
-
- if (options.AlphaCompositionMode != PixelAlphaCompositionMode.SrcOver
- && options.AlphaCompositionMode != PixelAlphaCompositionMode.Src)
- {
- return false;
- }
-
- const float Opaque = 1F;
-
- if (options.BlendPercentage != Opaque)
- {
- return false;
- }
-
- if (((Vector4)color).W != Opaque)
- {
- return false;
- }
-
- return true;
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/ImageSharp.Drawing.csproj b/src/ImageSharp.Drawing/ImageSharp.Drawing.csproj
deleted file mode 100644
index c4e3224bb..000000000
--- a/src/ImageSharp.Drawing/ImageSharp.Drawing.csproj
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
- SixLabors.ImageSharp.Drawing
- SixLabors.ImageSharp.Drawing
- An extension to ImageSharp that allows the drawing of images, paths, and text.
- SixLabors.ImageSharp.Drawing
- Image Draw Shape Path Font
- SixLabors.ImageSharp
-
- netcoreapp2.1;netstandard2.0;netstandard1.3
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/ImageSharp.Drawing/ImageSharp.Drawing.csproj.DotSettings b/src/ImageSharp.Drawing/ImageSharp.Drawing.csproj.DotSettings
deleted file mode 100644
index a728b5497..000000000
--- a/src/ImageSharp.Drawing/ImageSharp.Drawing.csproj.DotSettings
+++ /dev/null
@@ -1,2 +0,0 @@
-
- True
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Primitives/Region.cs b/src/ImageSharp.Drawing/Primitives/Region.cs
deleted file mode 100644
index 27f039f12..000000000
--- a/src/ImageSharp.Drawing/Primitives/Region.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Primitives
-{
- ///
- /// Represents a region of an image.
- ///
- public abstract class Region
- {
- ///
- /// Gets the maximum number of intersections to could be returned.
- ///
- public abstract int MaxIntersections { get; }
-
- ///
- /// Gets the bounding box that entirely surrounds this region.
- ///
- ///
- /// This should always contains all possible points returned from .
- ///
- public abstract Rectangle Bounds { get; }
-
- ///
- /// Scans the X axis for intersections at the Y axis position.
- ///
- /// The position along the y axis to find intersections.
- /// The buffer.
- /// A instance in the context of the caller.
- /// The number of intersections found.
- public abstract int Scan(float y, Span buffer, Configuration configuration);
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Primitives/ShapePath.cs b/src/ImageSharp.Drawing/Primitives/ShapePath.cs
deleted file mode 100644
index a4fef66a6..000000000
--- a/src/ImageSharp.Drawing/Primitives/ShapePath.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.ImageSharp.Processing;
-using SixLabors.Shapes;
-
-namespace SixLabors.ImageSharp.Primitives
-{
- ///
- /// A mapping between a and a region.
- ///
- internal class ShapePath : ShapeRegion
- {
- ///
- /// Initializes a new instance of the class.
- ///
- /// The shape.
- /// The pen to apply to the shape.
- public ShapePath(IPath shape, IPen pen)
- : base(shape.GenerateOutline(pen.StrokeWidth, pen.StrokePattern))
- {
- }
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Primitives/ShapeRegion.cs b/src/ImageSharp.Drawing/Primitives/ShapeRegion.cs
deleted file mode 100644
index c008f4419..000000000
--- a/src/ImageSharp.Drawing/Primitives/ShapeRegion.cs
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-using System.Buffers;
-
-using SixLabors.ImageSharp.Memory;
-using SixLabors.Primitives;
-using SixLabors.Shapes;
-
-namespace SixLabors.ImageSharp.Primitives
-{
- ///
- /// A mapping between a and a region.
- ///
- internal class ShapeRegion : Region
- {
- ///
- /// Initializes a new instance of the class.
- ///
- /// The shape.
- public ShapeRegion(IPath shape)
- {
- this.Shape = shape.AsClosedPath();
- int left = (int)MathF.Floor(shape.Bounds.Left);
- int top = (int)MathF.Floor(shape.Bounds.Top);
-
- int right = (int)MathF.Ceiling(shape.Bounds.Right);
- int bottom = (int)MathF.Ceiling(shape.Bounds.Bottom);
- this.Bounds = Rectangle.FromLTRB(left, top, right, bottom);
- }
-
- ///
- /// Gets the fillable shape
- ///
- public IPath Shape { get; }
-
- ///
- public override int MaxIntersections => this.Shape.MaxIntersections;
-
- ///
- public override Rectangle Bounds { get; }
-
- ///
- public override int Scan(float y, Span buffer, Configuration configuration)
- {
- var start = new PointF(this.Bounds.Left - 1, y);
- var end = new PointF(this.Bounds.Right + 1, y);
-
- using (IMemoryOwner tempBuffer = configuration.MemoryAllocator.Allocate(buffer.Length))
- {
- Span innerBuffer = tempBuffer.Memory.Span;
- int count = this.Shape.FindIntersections(start, end, innerBuffer);
-
- for (int i = 0; i < count; i++)
- {
- buffer[i] = innerBuffer[i].X;
- }
-
- return count;
- }
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/BrushApplicator.cs b/src/ImageSharp.Drawing/Processing/BrushApplicator.cs
deleted file mode 100644
index 058c6d0eb..000000000
--- a/src/ImageSharp.Drawing/Processing/BrushApplicator.cs
+++ /dev/null
@@ -1,117 +0,0 @@
-// 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.PixelFormats;
-using SixLabors.Memory;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// A primitive that converts a point into a color for discovering the fill color based on an implementation.
- ///
- /// The pixel format.
- ///
- public abstract class BrushApplicator : IDisposable
- where TPixel : struct, IPixel
- {
- ///
- /// Initializes a new instance of the class.
- ///
- /// The configuration instance to use when performing operations.
- /// The graphics options.
- /// The target.
- internal BrushApplicator(Configuration configuration, GraphicsOptions options, ImageFrame target)
- {
- this.Configuration = configuration;
- this.Target = target;
- this.Options = options;
- this.Blender = PixelOperations.Instance.GetPixelBlender(options);
- }
-
- ///
- /// Gets the configuration instance to use when performing operations.
- ///
- protected Configuration Configuration { get; }
-
- ///
- /// Gets the pixel blender.
- ///
- internal PixelBlender Blender { get; }
-
- ///
- /// Gets the target image.
- ///
- protected ImageFrame Target { get; }
-
- ///
- /// Gets thegraphics options
- ///
- protected GraphicsOptions Options { get; }
-
- ///
- /// Gets the overlay pixel at the specified position.
- ///
- /// The x-coordinate.
- /// The y-coordinate.
- /// The at the specified position.
- internal abstract TPixel this[int x, int y] { get; }
-
- ///
- public void Dispose()
- {
- this.Dispose(true);
- GC.SuppressFinalize(this);
- }
-
- ///
- /// Disposes the object and frees resources for the Garbage Collector.
- ///
- /// Whether to dispose managed and unmanaged objects.
- protected virtual void Dispose(bool disposing)
- {
- }
-
- ///
- /// Applies the opacity weighting for each pixel in a scanline to the target based on the pattern contained in the brush.
- ///
- /// A collection of opacity values between 0 and 1 to be merged with the brushed color value before being applied to the target.
- /// The x-position in the target pixel space that the start of the scanline data corresponds to.
- /// The y-position in the target pixel space that whole scanline corresponds to.
- /// scanlineBuffer will be > scanlineWidth but provide and offset in case we want to share a larger buffer across runs.
- internal virtual void Apply(Span scanline, int x, int y)
- {
- MemoryAllocator memoryAllocator = this.Target.MemoryAllocator;
-
- using (IMemoryOwner amountBuffer = memoryAllocator.Allocate(scanline.Length))
- using (IMemoryOwner overlay = memoryAllocator.Allocate(scanline.Length))
- {
- Span amountSpan = amountBuffer.Memory.Span;
- Span overlaySpan = overlay.Memory.Span;
- float blendPercentage = this.Options.BlendPercentage;
-
- if (blendPercentage < 1)
- {
- for (int i = 0; i < scanline.Length; i++)
- {
- amountSpan[i] = scanline[i] * blendPercentage;
- overlaySpan[i] = this[x + i, y];
- }
- }
- else
- {
- for (int i = 0; i < scanline.Length; i++)
- {
- amountSpan[i] = scanline[i];
- overlaySpan[i] = this[x + i, y];
- }
- }
-
- Span destinationRow = this.Target.GetPixelRowSpan(y).Slice(x, scanline.Length);
- this.Blender.Blend(this.Configuration, destinationRow, destinationRow, overlaySpan, amountSpan);
- }
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/Brushes.cs b/src/ImageSharp.Drawing/Processing/Brushes.cs
deleted file mode 100644
index bd10e90c6..000000000
--- a/src/ImageSharp.Drawing/Processing/Brushes.cs
+++ /dev/null
@@ -1,222 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// A collection of methods for creating generic brushes.
- ///
- /// A New
- public static class Brushes
- {
- ///
- /// Percent10 Hatch Pattern
- ///
- /// ---> x axis
- /// ^
- /// | y - axis
- /// |
- /// see PatternBrush for details about how to make new patterns work
- private static readonly bool[,] Percent10Pattern =
- {
- { true, false, false, false },
- { false, false, false, false },
- { false, false, true, false },
- { false, false, false, false }
- };
-
- ///
- /// Percent20 pattern.
- ///
- private static readonly bool[,] Percent20Pattern =
- {
- { true, false, false, false },
- { false, false, true, false },
- { true, false, false, false },
- { false, false, true, false }
- };
-
- ///
- /// Horizontal Hatch Pattern
- ///
- private static readonly bool[,] HorizontalPattern =
- {
- { false },
- { true },
- { false },
- { false }
- };
-
- ///
- /// Min Pattern
- ///
- private static readonly bool[,] MinPattern =
- {
- { false },
- { false },
- { false },
- { true }
- };
-
- ///
- /// Vertical Pattern
- ///
- private static readonly bool[,] VerticalPattern =
- {
- { false, true, false, false },
- };
-
- ///
- /// Forward Diagonal Pattern
- ///
- private static readonly bool[,] ForwardDiagonalPattern =
- {
- { false, false, false, true },
- { false, false, true, false },
- { false, true, false, false },
- { true, false, false, false }
- };
-
- ///
- /// Backward Diagonal Pattern
- ///
- private static readonly bool[,] BackwardDiagonalPattern =
- {
- { true, false, false, false },
- { false, true, false, false },
- { false, false, true, false },
- { false, false, false, true }
- };
-
- ///
- /// Create as brush that will paint a solid color
- ///
- /// The color.
- /// A New
- public static SolidBrush Solid(Color color) => new SolidBrush(color);
-
- ///
- /// Create as brush that will paint a Percent10 Hatch Pattern with the specified colors
- ///
- /// Color of the foreground.
- /// A New
- public static PatternBrush Percent10(Color foreColor) =>
- new PatternBrush(foreColor, Color.Transparent, Percent10Pattern);
-
- ///
- /// Create as brush that will paint a Percent10 Hatch Pattern with the specified colors
- ///
- /// Color of the foreground.
- /// Color of the background.
- /// A New
- public static PatternBrush Percent10(Color foreColor, Color backColor) =>
- new PatternBrush(foreColor, backColor, Percent10Pattern);
-
- ///
- /// Create as brush that will paint a Percent20 Hatch Pattern with the specified foreground color and a
- /// transparent background.
- ///
- /// Color of the foreground.
- /// A New
- public static PatternBrush Percent20(Color foreColor) =>
- new PatternBrush(foreColor, Color.Transparent, Percent20Pattern);
-
- ///
- /// Create as brush that will paint a Percent20 Hatch Pattern with the specified colors
- ///
- /// Color of the foreground.
- /// Color of the background.
- /// A New
- public static PatternBrush Percent20(Color foreColor, Color backColor) =>
- new PatternBrush(foreColor, backColor, Percent20Pattern);
-
- ///
- /// Create as brush that will paint a Horizontal Hatch Pattern with the specified foreground color and a
- /// transparent background.
- ///
- /// Color of the foreground.
- /// A New
- public static PatternBrush Horizontal(Color foreColor) =>
- new PatternBrush(foreColor, Color.Transparent, HorizontalPattern);
-
- ///
- /// Create as brush that will paint a Horizontal Hatch Pattern with the specified colors
- ///
- /// Color of the foreground.
- /// Color of the background.
- /// A New
- public static PatternBrush Horizontal(Color foreColor, Color backColor) =>
- new PatternBrush(foreColor, backColor, HorizontalPattern);
-
- ///
- /// Create as brush that will paint a Min Hatch Pattern with the specified foreground color and a
- /// transparent background.
- ///
- /// Color of the foreground.
- /// A New
- public static PatternBrush Min(Color foreColor) => new PatternBrush(foreColor, Color.Transparent, MinPattern);
-
- ///
- /// Create as brush that will paint a Min Hatch Pattern with the specified colors
- ///
- /// Color of the foreground.
- /// Color of the background.
- /// A New
- public static PatternBrush Min(Color foreColor, Color backColor) =>
- new PatternBrush(foreColor, backColor, MinPattern);
-
- ///
- /// Create as brush that will paint a Vertical Hatch Pattern with the specified foreground color and a
- /// transparent background.
- ///
- /// Color of the foreground.
- /// A New
- public static PatternBrush Vertical(Color foreColor) =>
- new PatternBrush(foreColor, Color.Transparent, VerticalPattern);
-
- ///
- /// Create as brush that will paint a Vertical Hatch Pattern with the specified colors
- ///
- /// Color of the foreground.
- /// Color of the background.
- /// A New
- public static PatternBrush Vertical(Color foreColor, Color backColor) =>
- new PatternBrush(foreColor, backColor, VerticalPattern);
-
- ///
- /// Create as brush that will paint a Forward Diagonal Hatch Pattern with the specified foreground color and a
- /// transparent background.
- ///
- /// Color of the foreground.
- /// A New
- public static PatternBrush ForwardDiagonal(Color foreColor) =>
- new PatternBrush(foreColor, Color.Transparent, ForwardDiagonalPattern);
-
- ///
- /// Create as brush that will paint a Forward Diagonal Hatch Pattern with the specified colors
- ///
- /// Color of the foreground.
- /// Color of the background.
- /// A New
- public static PatternBrush ForwardDiagonal(Color foreColor, Color backColor) =>
- new PatternBrush(foreColor, backColor, ForwardDiagonalPattern);
-
- ///
- /// Create as brush that will paint a Backward Diagonal Hatch Pattern with the specified foreground color and a
- /// transparent background.
- ///
- /// Color of the foreground.
- /// A New
- public static PatternBrush BackwardDiagonal(Color foreColor) =>
- new PatternBrush(foreColor, Color.Transparent, BackwardDiagonalPattern);
-
- ///
- /// Create as brush that will paint a Backward Diagonal Hatch Pattern with the specified colors
- ///
- /// Color of the foreground.
- /// Color of the background.
- /// A New
- public static PatternBrush BackwardDiagonal(Color foreColor, Color backColor) =>
- new PatternBrush(foreColor, backColor, BackwardDiagonalPattern);
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/ColorStop.cs b/src/ImageSharp.Drawing/Processing/ColorStop.cs
deleted file mode 100644
index 21c82b63f..000000000
--- a/src/ImageSharp.Drawing/Processing/ColorStop.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System.Diagnostics;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// A struct that defines a single color stop.
- ///
- [DebuggerDisplay("ColorStop({Ratio} -> {Color}")]
- public readonly struct ColorStop
- {
- ///
- /// Initializes a new instance of the struct.
- ///
- /// Where should it be? 0 is at the start, 1 at the end of the Gradient.
- /// What color should be used at that point?
- public ColorStop(float ratio, in Color color)
- {
- this.Ratio = ratio;
- this.Color = color;
- }
-
- ///
- /// Gets the point along the defined gradient axis.
- ///
- public float Ratio { get; }
-
- ///
- /// Gets the color to be used.
- ///
- public Color Color { get; }
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/DrawingHelpers.cs b/src/ImageSharp.Drawing/Processing/DrawingHelpers.cs
deleted file mode 100644
index 25a8204f2..000000000
--- a/src/ImageSharp.Drawing/Processing/DrawingHelpers.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.ImageSharp.Primitives;
-
-namespace SixLabors.ImageSharp.Processing
-{
- internal static class DrawingHelpers
- {
- ///
- /// Convert a to a of the given pixel type.
- ///
- public static DenseMatrix ToPixelMatrix(this DenseMatrix colorMatrix, Configuration configuration)
- where TPixel : struct, IPixel
- {
- var result = new DenseMatrix(colorMatrix.Columns, colorMatrix.Rows);
- Color.ToPixel(configuration, colorMatrix.Span, result.Span);
- return result;
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/EllipticGradientBrush.cs b/src/ImageSharp.Drawing/Processing/EllipticGradientBrush.cs
deleted file mode 100644
index fbab3605d..000000000
--- a/src/ImageSharp.Drawing/Processing/EllipticGradientBrush.cs
+++ /dev/null
@@ -1,165 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Gradient Brush with elliptic shape.
- /// The ellipse is defined by a center point,
- /// a point on the longest extension of the ellipse and
- /// the ratio between longest and shortest extension.
- ///
- public sealed class EllipticGradientBrush : GradientBrush
- {
- private readonly PointF center;
-
- private readonly PointF referenceAxisEnd;
-
- private readonly float axisRatio;
-
- ///
- /// The center of the elliptical gradient and 0 for the color stops.
- /// The end point of the reference axis of the ellipse.
- ///
- /// The ratio of the axis widths.
- /// The second axis' is perpendicular to the reference axis and
- /// it's length is the reference axis' length multiplied by this factor.
- ///
- /// Defines how the colors of the gradients are repeated.
- /// the color stops as defined in base class.
- public EllipticGradientBrush(
- PointF center,
- PointF referenceAxisEnd,
- float axisRatio,
- GradientRepetitionMode repetitionMode,
- params ColorStop[] colorStops)
- : base(repetitionMode, colorStops)
- {
- this.center = center;
- this.referenceAxisEnd = referenceAxisEnd;
- this.axisRatio = axisRatio;
- }
-
- ///
- public override BrushApplicator CreateApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame source,
- RectangleF region) =>
- new RadialGradientBrushApplicator(
- configuration,
- options,
- source,
- this.center,
- this.referenceAxisEnd,
- this.axisRatio,
- this.ColorStops,
- this.RepetitionMode);
-
- ///
- private sealed class RadialGradientBrushApplicator : GradientBrushApplicator
- where TPixel : struct, IPixel
- {
- private readonly PointF center;
-
- private readonly PointF referenceAxisEnd;
-
- private readonly float axisRatio;
-
- private readonly double rotation;
-
- private readonly float referenceRadius;
-
- private readonly float secondRadius;
-
- private readonly float cosRotation;
-
- private readonly float sinRotation;
-
- private readonly float secondRadiusSquared;
-
- private readonly float referenceRadiusSquared;
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The configuration instance to use when performing operations.
- /// The graphics options.
- /// The target image.
- /// Center of the ellipse.
- /// Point on one angular points of the ellipse.
- ///
- /// Ratio of the axis length's. Used to determine the length of the second axis,
- /// the first is defined by and .
- /// Definition of colors.
- /// Defines how the gradient colors are repeated.
- public RadialGradientBrushApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame target,
- PointF center,
- PointF referenceAxisEnd,
- float axisRatio,
- ColorStop[] colorStops,
- GradientRepetitionMode repetitionMode)
- : base(configuration, options, target, colorStops, repetitionMode)
- {
- this.center = center;
- this.referenceAxisEnd = referenceAxisEnd;
- this.axisRatio = axisRatio;
- this.rotation = this.AngleBetween(
- this.center,
- new PointF(this.center.X + 1, this.center.Y),
- this.referenceAxisEnd);
- this.referenceRadius = this.DistanceBetween(this.center, this.referenceAxisEnd);
- this.secondRadius = this.referenceRadius * this.axisRatio;
-
- this.referenceRadiusSquared = this.referenceRadius * this.referenceRadius;
- this.secondRadiusSquared = this.secondRadius * this.secondRadius;
-
- this.sinRotation = (float)Math.Sin(this.rotation);
- this.cosRotation = (float)Math.Cos(this.rotation);
- }
-
- ///
- protected override float PositionOnGradient(float xt, float yt)
- {
- float x0 = xt - this.center.X;
- float y0 = yt - this.center.Y;
-
- float x = (x0 * this.cosRotation) - (y0 * this.sinRotation);
- float y = (x0 * this.sinRotation) + (y0 * this.cosRotation);
-
- float xSquared = x * x;
- float ySquared = y * y;
-
- return (xSquared / this.referenceRadiusSquared) + (ySquared / this.secondRadiusSquared);
- }
-
- private float AngleBetween(PointF junction, PointF a, PointF b)
- {
- PointF vA = a - junction;
- PointF vB = b - junction;
- return MathF.Atan2(vB.Y, vB.X) - MathF.Atan2(vA.Y, vA.X);
- }
-
- private float DistanceBetween(
- PointF p1,
- PointF p2)
- {
- // TODO: Can we not just use Vector2 distance here?
- float dX = p1.X - p2.X;
- float dXsquared = dX * dX;
-
- float dY = p1.Y - p2.Y;
- float dYsquared = dY * dY;
- return MathF.Sqrt(dXsquared + dYsquared);
- }
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/Extensions/DrawBezierExtensions.cs b/src/ImageSharp.Drawing/Processing/Extensions/DrawBezierExtensions.cs
deleted file mode 100644
index 7660e7225..000000000
--- a/src/ImageSharp.Drawing/Processing/Extensions/DrawBezierExtensions.cs
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.Primitives;
-using SixLabors.Shapes;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Adds extensions that allow the drawing of Bezier paths to the type.
- ///
- public static class DrawBezierExtensions
- {
- ///
- /// Draws the provided points as an open Bezier path at the provided thickness with the supplied brush
- ///
- /// The image this method extends.
- /// The options.
- /// The brush.
- /// The thickness.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawBeziers(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IBrush brush,
- float thickness,
- params PointF[] points) =>
- source.Draw(options, new Pen(brush, thickness), new Path(new CubicBezierLineSegment(points)));
-
- ///
- /// Draws the provided points as an open Bezier path at the provided thickness with the supplied brush
- ///
- /// The image this method extends.
- /// The brush.
- /// The thickness.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawBeziers(
- this IImageProcessingContext source,
- IBrush brush,
- float thickness,
- params PointF[] points) =>
- source.Draw(new Pen(brush, thickness), new Path(new CubicBezierLineSegment(points)));
-
- ///
- /// Draws the provided points as an open Bezier path at the provided thickness with the supplied brush
- ///
- /// The image this method extends.
- /// The color.
- /// The thickness.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawBeziers(
- this IImageProcessingContext source,
- Color color,
- float thickness,
- params PointF[] points) =>
- source.DrawBeziers(new SolidBrush(color), thickness, points);
-
- ///
- /// Draws the provided points as an open Bezier path at the provided thickness with the supplied brush
- ///
- /// The image this method extends.
- /// The options.
- /// The color.
- /// The thickness.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawBeziers(
- this IImageProcessingContext source,
- GraphicsOptions options,
- Color color,
- float thickness,
- params PointF[] points) =>
- source.DrawBeziers(options, new SolidBrush(color), thickness, points);
-
- ///
- /// Draws the provided points as an open Bezier path with the supplied pen
- ///
- /// The image this method extends.
- /// The options.
- /// The pen.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawBeziers(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IPen pen,
- params PointF[] points) =>
- source.Draw(options, pen, new Path(new CubicBezierLineSegment(points)));
-
- ///
- /// Draws the provided points as an open Bezier path with the supplied pen
- ///
- /// The image this method extends.
- /// The pen.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawBeziers(
- this IImageProcessingContext source,
- IPen pen,
- params PointF[] points) =>
- source.Draw(pen, new Path(new CubicBezierLineSegment(points)));
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/Extensions/DrawLineExtensions.cs b/src/ImageSharp.Drawing/Processing/Extensions/DrawLineExtensions.cs
deleted file mode 100644
index 98e8fdc59..000000000
--- a/src/ImageSharp.Drawing/Processing/Extensions/DrawLineExtensions.cs
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.Primitives;
-using SixLabors.Shapes;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Adds extensions that allow the drawing of lines to the type.
- ///
- public static class DrawLineExtensions
- {
- ///
- /// Draws the provided Points as an open Linear path at the provided thickness with the supplied brush
- ///
- /// The image this method extends.
- /// The options.
- /// The brush.
- /// The thickness.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawLines(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IBrush brush,
- float thickness,
- params PointF[] points) =>
- source.Draw(options, new Pen(brush, thickness), new Path(new LinearLineSegment(points)));
-
- ///
- /// Draws the provided Points as an open Linear path at the provided thickness with the supplied brush
- ///
- /// The image this method extends.
- /// The brush.
- /// The thickness.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawLines(
- this IImageProcessingContext source,
- IBrush brush,
- float thickness,
- params PointF[] points) =>
- source.Draw(new Pen(brush, thickness), new Path(new LinearLineSegment(points)));
-
- ///
- /// Draws the provided Points as an open Linear path at the provided thickness with the supplied brush
- ///
- /// The image this method extends.
- /// The color.
- /// The thickness.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawLines(
- this IImageProcessingContext source,
- Color color,
- float thickness,
- params PointF[] points) =>
- source.DrawLines(new SolidBrush(color), thickness, points);
-
- ///
- /// Draws the provided Points as an open Linear path at the provided thickness with the supplied brush
- ///
- /// The image this method extends.
- /// The options.
- /// The color.
- /// The thickness.
- /// The points.
- /// The .>
- public static IImageProcessingContext DrawLines(
- this IImageProcessingContext source,
- GraphicsOptions options,
- Color color,
- float thickness,
- params PointF[] points) =>
- source.DrawLines(options, new SolidBrush(color), thickness, points);
-
- ///
- /// Draws the provided Points as an open Linear path with the supplied pen
- ///
- /// The image this method extends.
- /// The options.
- /// The pen.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawLines(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IPen pen,
- params PointF[] points) =>
- source.Draw(options, pen, new Path(new LinearLineSegment(points)));
-
- ///
- /// Draws the provided Points as an open Linear path with the supplied pen
- ///
- /// The image this method extends.
- /// The pen.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawLines(
- this IImageProcessingContext source,
- IPen pen,
- params PointF[] points) =>
- source.Draw(pen, new Path(new LinearLineSegment(points)));
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/Extensions/DrawPathCollectionExtensions.cs b/src/ImageSharp.Drawing/Processing/Extensions/DrawPathCollectionExtensions.cs
deleted file mode 100644
index 90b8c68ac..000000000
--- a/src/ImageSharp.Drawing/Processing/Extensions/DrawPathCollectionExtensions.cs
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.Shapes;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Adds extensions that allow the drawing of collections of polygon outlines to the type.
- ///
- public static class DrawPathCollectionExtensions
- {
- ///
- /// Draws the outline of the polygon with the provided pen.
- ///
- /// The image this method extends.
- /// The options.
- /// The pen.
- /// The paths.
- /// The .
- public static IImageProcessingContext Draw(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IPen pen,
- IPathCollection paths)
- {
- foreach (IPath path in paths)
- {
- source.Draw(options, pen, path);
- }
-
- return source;
- }
-
- ///
- /// Draws the outline of the polygon with the provided pen.
- ///
- /// The image this method extends.
- /// The pen.
- /// The paths.
- /// The .
- public static IImageProcessingContext
- Draw(this IImageProcessingContext source, IPen pen, IPathCollection paths) =>
- source.Draw(new GraphicsOptions(), pen, paths);
-
- ///
- /// Draws the outline of the polygon with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The options.
- /// The brush.
- /// The thickness.
- /// The shapes.
- /// The .
- public static IImageProcessingContext Draw(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IBrush brush,
- float thickness,
- IPathCollection paths) =>
- source.Draw(options, new Pen(brush, thickness), paths);
-
- ///
- /// Draws the outline of the polygon with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The brush.
- /// The thickness.
- /// The paths.
- /// The .
- public static IImageProcessingContext Draw(
- this IImageProcessingContext source,
- IBrush brush,
- float thickness,
- IPathCollection paths) =>
- source.Draw(new Pen(brush, thickness), paths);
-
- ///
- /// Draws the outline of the polygon with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The options.
- /// The color.
- /// The thickness.
- /// The paths.
- /// The .
- public static IImageProcessingContext Draw(
- this IImageProcessingContext source,
- GraphicsOptions options,
- Color color,
- float thickness,
- IPathCollection paths) =>
- source.Draw(options, new SolidBrush(color), thickness, paths);
-
- ///
- /// Draws the outline of the polygon with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The color.
- /// The thickness.
- /// The paths.
- /// The .
- public static IImageProcessingContext Draw(
- this IImageProcessingContext source,
- Color color,
- float thickness,
- IPathCollection paths) =>
- source.Draw(new SolidBrush(color), thickness, paths);
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/Extensions/DrawPathExtensions.cs b/src/ImageSharp.Drawing/Processing/Extensions/DrawPathExtensions.cs
deleted file mode 100644
index 822375ca9..000000000
--- a/src/ImageSharp.Drawing/Processing/Extensions/DrawPathExtensions.cs
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.ImageSharp.Primitives;
-using SixLabors.Shapes;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Adds extensions that allow the drawing of polygon outlines to the type.
- ///
- public static class DrawPathExtensions
- {
- ///
- /// Draws the outline of the polygon with the provided pen.
- ///
- /// The image this method extends.
- /// The options.
- /// The pen.
- /// The path.
- /// The .
- public static IImageProcessingContext Draw(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IPen pen,
- IPath path) =>
- source.Fill(options, pen.StrokeFill, new ShapePath(path, pen));
-
- ///
- /// Draws the outline of the polygon with the provided pen.
- ///
- /// The image this method extends.
- /// The pen.
- /// The path.
- /// The .
- public static IImageProcessingContext Draw(this IImageProcessingContext source, IPen pen, IPath path) =>
- source.Draw(new GraphicsOptions(), pen, path);
-
- ///
- /// Draws the outline of the polygon with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The options.
- /// The brush.
- /// The thickness.
- /// The shape.
- /// The .
- public static IImageProcessingContext Draw(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IBrush brush,
- float thickness,
- IPath path) =>
- source.Draw(options, new Pen(brush, thickness), path);
-
- ///
- /// Draws the outline of the polygon with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The brush.
- /// The thickness.
- /// The path.
- /// The .
- public static IImageProcessingContext Draw(
- this IImageProcessingContext source,
- IBrush brush,
- float thickness,
- IPath path) =>
- source.Draw(new Pen(brush, thickness), path);
-
- ///
- /// Draws the outline of the polygon with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The options.
- /// The color.
- /// The thickness.
- /// The path.
- /// The .
- public static IImageProcessingContext Draw(
- this IImageProcessingContext source,
- GraphicsOptions options,
- Color color,
- float thickness,
- IPath path) =>
- source.Draw(options, new SolidBrush(color), thickness, path);
-
- ///
- /// Draws the outline of the polygon with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The color.
- /// The thickness.
- /// The path.
- /// The .
- public static IImageProcessingContext Draw(
- this IImageProcessingContext source,
- Color color,
- float thickness,
- IPath path) =>
- source.Draw(new SolidBrush(color), thickness, path);
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/Extensions/DrawPolygonExtensions.cs b/src/ImageSharp.Drawing/Processing/Extensions/DrawPolygonExtensions.cs
deleted file mode 100644
index d51e58645..000000000
--- a/src/ImageSharp.Drawing/Processing/Extensions/DrawPolygonExtensions.cs
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.Primitives;
-using SixLabors.Shapes;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Adds extensions that allow the drawing of closed linear polygons to the type.
- ///
- public static class DrawPolygonExtensions
- {
- ///
- /// Draws the provided Points as a closed Linear Polygon with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The options.
- /// The brush.
- /// The thickness.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawPolygon(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IBrush brush,
- float thickness,
- params PointF[] points) =>
- source.Draw(options, new Pen(brush, thickness), new Polygon(new LinearLineSegment(points)));
-
- ///
- /// Draws the provided Points as a closed Linear Polygon with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The brush.
- /// The thickness.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawPolygon(
- this IImageProcessingContext source,
- IBrush brush,
- float thickness,
- params PointF[] points) =>
- source.Draw(new Pen(brush, thickness), new Polygon(new LinearLineSegment(points)));
-
- ///
- /// Draws the provided Points as a closed Linear Polygon with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The color.
- /// The thickness.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawPolygon(
- this IImageProcessingContext source,
- Color color,
- float thickness,
- params PointF[] points) =>
- source.DrawPolygon(new SolidBrush(color), thickness, points);
-
- ///
- /// Draws the provided Points as a closed Linear Polygon with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The options.
- /// The color.
- /// The thickness.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawPolygon(
- this IImageProcessingContext source,
- GraphicsOptions options,
- Color color,
- float thickness,
- params PointF[] points) =>
- source.DrawPolygon(options, new SolidBrush(color), thickness, points);
-
- ///
- /// Draws the provided Points as a closed Linear Polygon with the provided Pen.
- ///
- /// The image this method extends.
- /// The pen.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawPolygon(
- this IImageProcessingContext source,
- IPen pen,
- params PointF[] points) =>
- source.Draw(new GraphicsOptions(), pen, new Polygon(new LinearLineSegment(points)));
-
- ///
- /// Draws the provided Points as a closed Linear Polygon with the provided Pen.
- ///
- /// The image this method extends.
- /// The options.
- /// The pen.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawPolygon(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IPen pen,
- params PointF[] points) =>
- source.Draw(options, pen, new Polygon(new LinearLineSegment(points)));
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/Extensions/DrawRectangleExtensions.cs b/src/ImageSharp.Drawing/Processing/Extensions/DrawRectangleExtensions.cs
deleted file mode 100644
index b3b5dd76a..000000000
--- a/src/ImageSharp.Drawing/Processing/Extensions/DrawRectangleExtensions.cs
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.Primitives;
-using SixLabors.Shapes;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Adds extensions that allow the drawing of rectangles to the type.
- ///
- public static class DrawRectangleExtensions
- {
- ///
- /// Draws the outline of the rectangle with the provided pen.
- ///
- /// The image this method extends.
- /// The options.
- /// The pen.
- /// The shape.
- /// The .
- public static IImageProcessingContext Draw(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IPen pen,
- RectangleF shape) =>
- source.Draw(options, pen, new RectangularPolygon(shape.X, shape.Y, shape.Width, shape.Height));
-
- ///
- /// Draws the outline of the rectangle with the provided pen.
- ///
- /// The image this method extends.
- /// The pen.
- /// The shape.
- /// The .
- public static IImageProcessingContext Draw(this IImageProcessingContext source, IPen pen, RectangleF shape) =>
- source.Draw(new GraphicsOptions(), pen, shape);
-
- ///
- /// Draws the outline of the rectangle with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The options.
- /// The brush.
- /// The thickness.
- /// The shape.
- /// The .
- public static IImageProcessingContext Draw(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IBrush brush,
- float thickness,
- RectangleF shape) =>
- source.Draw(options, new Pen(brush, thickness), shape);
-
- ///
- /// Draws the outline of the rectangle with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The brush.
- /// The thickness.
- /// The shape.
- /// The .
- public static IImageProcessingContext Draw(
- this IImageProcessingContext source,
- IBrush brush,
- float thickness,
- RectangleF shape) =>
- source.Draw(new Pen(brush, thickness), shape);
-
- ///
- /// Draws the outline of the rectangle with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The options.
- /// The color.
- /// The thickness.
- /// The shape.
- /// The .
- public static IImageProcessingContext Draw(
- this IImageProcessingContext source,
- GraphicsOptions options,
- Color color,
- float thickness,
- RectangleF shape) =>
- source.Draw(options, new SolidBrush(color), thickness, shape);
-
- ///
- /// Draws the outline of the rectangle with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The color.
- /// The thickness.
- /// The shape.
- /// The .
- public static IImageProcessingContext Draw(
- this IImageProcessingContext source,
- Color color,
- float thickness,
- RectangleF shape) =>
- source.Draw(new SolidBrush(color), thickness, shape);
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/Extensions/DrawTextExtensions.cs b/src/ImageSharp.Drawing/Processing/Extensions/DrawTextExtensions.cs
deleted file mode 100644
index 82dbb8d97..000000000
--- a/src/ImageSharp.Drawing/Processing/Extensions/DrawTextExtensions.cs
+++ /dev/null
@@ -1,179 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.Fonts;
-using SixLabors.ImageSharp.Processing.Processors.Text;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Adds extensions that allow the drawing of text to the type.
- ///
- public static class DrawTextExtensions
- {
- ///
- /// Draws the text onto the the image filled via the brush.
- ///
- /// The image this method extends.
- /// The text.
- /// The font.
- /// The color.
- /// The location.
- ///
- /// The .
- ///
- public static IImageProcessingContext DrawText(
- this IImageProcessingContext source,
- string text,
- Font font,
- Color color,
- PointF location) =>
- source.DrawText(new TextGraphicsOptions(), text, font, color, location);
-
- ///
- /// Draws the text onto the the image filled via the brush.
- ///
- /// The image this method extends.
- /// The options.
- /// The text.
- /// The font.
- /// The color.
- /// The location.
- ///
- /// The .
- ///
- public static IImageProcessingContext DrawText(
- this IImageProcessingContext source,
- TextGraphicsOptions options,
- string text,
- Font font,
- Color color,
- PointF location) =>
- source.DrawText(options, text, font, Brushes.Solid(color), null, location);
-
- ///
- /// Draws the text onto the the image filled via the brush.
- ///
- /// The image this method extends.
- /// The text.
- /// The font.
- /// The brush.
- /// The location.
- ///
- /// The .
- ///
- public static IImageProcessingContext DrawText(
- this IImageProcessingContext source,
- string text,
- Font font,
- IBrush brush,
- PointF location) =>
- source.DrawText(new TextGraphicsOptions(), text, font, brush, location);
-
- ///
- /// Draws the text onto the the image filled via the brush.
- ///
- /// The image this method extends.
- /// The options.
- /// The text.
- /// The font.
- /// The brush.
- /// The location.
- ///
- /// The .
- ///
- public static IImageProcessingContext DrawText(
- this IImageProcessingContext source,
- TextGraphicsOptions options,
- string text,
- Font font,
- IBrush brush,
- PointF location) =>
- source.DrawText(options, text, font, brush, null, location);
-
- ///
- /// Draws the text onto the the image outlined via the pen.
- ///
- /// The image this method extends.
- /// The text.
- /// The font.
- /// The pen.
- /// The location.
- ///
- /// The .
- ///
- public static IImageProcessingContext DrawText(
- this IImageProcessingContext source,
- string text,
- Font font,
- IPen pen,
- PointF location) =>
- source.DrawText(new TextGraphicsOptions(), text, font, pen, location);
-
- ///
- /// Draws the text onto the the image outlined via the pen.
- ///
- /// The image this method extends.
- /// The options.
- /// The text.
- /// The font.
- /// The pen.
- /// The location.
- ///
- /// The .
- ///
- public static IImageProcessingContext DrawText(
- this IImageProcessingContext source,
- TextGraphicsOptions options,
- string text,
- Font font,
- IPen pen,
- PointF location) =>
- source.DrawText(options, text, font, null, pen, location);
-
- ///
- /// Draws the text onto the the image filled via the brush then outlined via the pen.
- ///
- /// The image this method extends.
- /// The text.
- /// The font.
- /// The brush.
- /// The pen.
- /// The location.
- ///
- /// The .
- ///
- public static IImageProcessingContext DrawText(
- this IImageProcessingContext source,
- string text,
- Font font,
- IBrush brush,
- IPen pen,
- PointF location) =>
- source.DrawText(new TextGraphicsOptions(), text, font, brush, pen, location);
-
- ///
- /// Draws the text using the default resolution of 72dpi onto the the image filled via the brush then outlined via the pen.
- ///
- /// The image this method extends.
- /// The options.
- /// The text.
- /// The font.
- /// The brush.
- /// The pen.
- /// The location.
- ///
- /// The .
- ///
- public static IImageProcessingContext DrawText(
- this IImageProcessingContext source,
- TextGraphicsOptions options,
- string text,
- Font font,
- IBrush brush,
- IPen pen,
- PointF location) =>
- source.ApplyProcessor(new DrawTextProcessor(options, text, font, brush, pen, location));
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/Extensions/FillPathBuilderExtensions.cs b/src/ImageSharp.Drawing/Processing/Extensions/FillPathBuilderExtensions.cs
deleted file mode 100644
index 030fe6ff1..000000000
--- a/src/ImageSharp.Drawing/Processing/Extensions/FillPathBuilderExtensions.cs
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-
-using SixLabors.Shapes;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Adds extensions that allow the filling of polygons with various brushes to the type.
- ///
- public static class FillPathBuilderExtensions
- {
- ///
- /// Flood fills the image in the shape of the provided polygon with the specified brush.
- ///
- /// The image this method extends.
- /// The graphics options.
- /// The brush.
- /// The shape.
- /// The .
- public static IImageProcessingContext Fill(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IBrush brush,
- Action path)
- {
- var pb = new PathBuilder();
- path(pb);
-
- return source.Fill(options, brush, pb.Build());
- }
-
- ///
- /// Flood fills the image in the shape of the provided polygon with the specified brush.
- ///
- /// The image this method extends.
- /// The brush.
- /// The path.
- /// The .
- public static IImageProcessingContext Fill(
- this IImageProcessingContext source,
- IBrush brush,
- Action path) =>
- source.Fill(new GraphicsOptions(), brush, path);
-
- ///
- /// Flood fills the image in the shape of the provided polygon with the specified brush.
- ///
- /// The image this method extends.
- /// The options.
- /// The color.
- /// The path.
- /// The .
- public static IImageProcessingContext Fill(
- this IImageProcessingContext source,
- GraphicsOptions options,
- Color color,
- Action path) =>
- source.Fill(options, new SolidBrush(color), path);
-
- ///
- /// Flood fills the image in the shape of the provided polygon with the specified brush.
- ///
- /// The image this method extends.
- /// The color.
- /// The path.
- /// The .
- public static IImageProcessingContext Fill(
- this IImageProcessingContext source,
- Color color,
- Action path) =>
- source.Fill(new SolidBrush(color), path);
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/Extensions/FillPathCollectionExtensions.cs b/src/ImageSharp.Drawing/Processing/Extensions/FillPathCollectionExtensions.cs
deleted file mode 100644
index 5d8aaf307..000000000
--- a/src/ImageSharp.Drawing/Processing/Extensions/FillPathCollectionExtensions.cs
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.Shapes;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Adds extensions that allow the filling of collections of polygon outlines to the type.
- ///
- public static class FillPathCollectionExtensions
- {
- ///
- /// Flood fills the image in the shape of the provided polygon with the specified brush.
- ///
- /// The image this method extends.
- /// The graphics options.
- /// The brush.
- /// The shapes.
- /// The .
- public static IImageProcessingContext Fill(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IBrush brush,
- IPathCollection paths)
- {
- foreach (IPath s in paths)
- {
- source.Fill(options, brush, s);
- }
-
- return source;
- }
-
- ///
- /// Flood fills the image in the shape of the provided polygon with the specified brush.
- ///
- /// The image this method extends.
- /// The brush.
- /// The paths.
- /// The .
- public static IImageProcessingContext Fill(
- this IImageProcessingContext source,
- IBrush brush,
- IPathCollection paths) =>
- source.Fill(new GraphicsOptions(), brush, paths);
-
- ///
- /// Flood fills the image in the shape of the provided polygon with the specified brush.
- ///
- /// The image this method extends.
- /// The options.
- /// The color.
- /// The paths.
- /// The .
- public static IImageProcessingContext Fill(
- this IImageProcessingContext source,
- GraphicsOptions options,
- Color color,
- IPathCollection paths) =>
- source.Fill(options, new SolidBrush(color), paths);
-
- ///
- /// Flood fills the image in the shape of the provided polygon with the specified brush.
- ///
- /// The image this method extends.
- /// The color.
- /// The paths.
- /// The .
- public static IImageProcessingContext Fill(
- this IImageProcessingContext source,
- Color color,
- IPathCollection paths) =>
- source.Fill(new SolidBrush(color), paths);
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/Extensions/FillPathExtensions.cs b/src/ImageSharp.Drawing/Processing/Extensions/FillPathExtensions.cs
deleted file mode 100644
index 4d262aa5f..000000000
--- a/src/ImageSharp.Drawing/Processing/Extensions/FillPathExtensions.cs
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.ImageSharp.Primitives;
-using SixLabors.Shapes;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Adds extensions that allow the filling of polygon outlines to the type.
- ///
- public static class FillPathExtensions
- {
- ///
- /// Flood fills the image in the shape of the provided polygon with the specified brush.
- ///
- /// The image this method extends.
- /// The graphics options.
- /// The brush.
- /// The shape.
- /// The .
- public static IImageProcessingContext Fill(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IBrush brush,
- IPath path) =>
- source.Fill(options, brush, new ShapeRegion(path));
-
- ///
- /// Flood fills the image in the shape of the provided polygon with the specified brush.
- ///
- /// The image this method extends.
- /// The brush.
- /// The path.
- /// The .
- public static IImageProcessingContext Fill(this IImageProcessingContext source, IBrush brush, IPath path) =>
- source.Fill(new GraphicsOptions(), brush, new ShapeRegion(path));
-
- ///
- /// Flood fills the image in the shape of the provided polygon with the specified brush..
- ///
- /// The image this method extends.
- /// The options.
- /// The color.
- /// The path.
- /// The .
- public static IImageProcessingContext Fill(
- this IImageProcessingContext source,
- GraphicsOptions options,
- Color color,
- IPath path) =>
- source.Fill(options, new SolidBrush(color), path);
-
- ///
- /// Flood fills the image in the shape of the provided polygon with the specified brush..
- ///
- /// The image this method extends.
- /// The color.
- /// The path.
- /// The .
- public static IImageProcessingContext Fill(this IImageProcessingContext source, Color color, IPath path) =>
- source.Fill(new SolidBrush(color), path);
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/Extensions/FillPolygonExtensions.cs b/src/ImageSharp.Drawing/Processing/Extensions/FillPolygonExtensions.cs
deleted file mode 100644
index 9262c8baa..000000000
--- a/src/ImageSharp.Drawing/Processing/Extensions/FillPolygonExtensions.cs
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.Primitives;
-using SixLabors.Shapes;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Adds extensions that allow the filling of closed linear polygons to the type.
- ///
- public static class FillPolygonExtensions
- {
- ///
- /// Flood fills the image in the shape of a Linear polygon described by the points
- ///
- /// The image this method extends.
- /// The options.
- /// The brush.
- /// The points.
- /// The .
- public static IImageProcessingContext FillPolygon(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IBrush brush,
- params PointF[] points) =>
- source.Fill(options, brush, new Polygon(new LinearLineSegment(points)));
-
- ///
- /// Flood fills the image in the shape of a Linear polygon described by the points
- ///
- /// The image this method extends.
- /// The brush.
- /// The points.
- /// The .
- public static IImageProcessingContext FillPolygon(
- this IImageProcessingContext source,
- IBrush brush,
- params PointF[] points) =>
- source.Fill(brush, new Polygon(new LinearLineSegment(points)));
-
- ///
- /// Flood fills the image in the shape of a Linear polygon described by the points
- ///
- /// The image this method extends.
- /// The options.
- /// The color.
- /// The points.
- /// The .
- public static IImageProcessingContext FillPolygon(
- this IImageProcessingContext source,
- GraphicsOptions options,
- Color color,
- params PointF[] points) =>
- source.Fill(options, new SolidBrush(color), new Polygon(new LinearLineSegment(points)));
-
- ///
- /// Flood fills the image in the shape of a Linear polygon described by the points
- ///
- /// The image this method extends.
- /// The color.
- /// The points.
- /// The .
- public static IImageProcessingContext FillPolygon(
- this IImageProcessingContext source,
- Color color,
- params PointF[] points) =>
- source.Fill(new SolidBrush(color), new Polygon(new LinearLineSegment(points)));
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/Extensions/FillRectangleExtensions.cs b/src/ImageSharp.Drawing/Processing/Extensions/FillRectangleExtensions.cs
deleted file mode 100644
index cfe37deb2..000000000
--- a/src/ImageSharp.Drawing/Processing/Extensions/FillRectangleExtensions.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.Primitives;
-using SixLabors.Shapes;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Adds extensions that allow the filling of rectangles to the type.
- ///
- public static class FillRectangleExtensions
- {
- ///
- /// Flood fills the image in the shape of the provided rectangle with the specified brush.
- ///
- /// The image this method extends.
- /// The options.
- /// The brush.
- /// The shape.
- /// The .
- public static IImageProcessingContext Fill(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IBrush brush,
- RectangleF shape) =>
- source.Fill(options, brush, new RectangularPolygon(shape.X, shape.Y, shape.Width, shape.Height));
-
- ///
- /// Flood fills the image in the shape of the provided rectangle with the specified brush.
- ///
- /// The image this method extends.
- /// The brush.
- /// The shape.
- /// The .
- public static IImageProcessingContext
- Fill(this IImageProcessingContext source, IBrush brush, RectangleF shape) =>
- source.Fill(brush, new RectangularPolygon(shape.X, shape.Y, shape.Width, shape.Height));
-
- ///
- /// Flood fills the image in the shape of the provided rectangle with the specified brush.
- ///
- /// The image this method extends.
- /// The options.
- /// The color.
- /// The shape.
- /// The .
- public static IImageProcessingContext Fill(
- this IImageProcessingContext source,
- GraphicsOptions options,
- Color color,
- RectangleF shape) =>
- source.Fill(options, new SolidBrush(color), shape);
-
- ///
- /// Flood fills the image in the shape of the provided rectangle with the specified brush.
- ///
- /// The image this method extends.
- /// The color.
- /// The shape.
- /// The .
- public static IImageProcessingContext
- Fill(this IImageProcessingContext source, Color color, RectangleF shape) =>
- source.Fill(new SolidBrush(color), shape);
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/Extensions/FillRegionExtensions.cs b/src/ImageSharp.Drawing/Processing/Extensions/FillRegionExtensions.cs
deleted file mode 100644
index fbb6dbda5..000000000
--- a/src/ImageSharp.Drawing/Processing/Extensions/FillRegionExtensions.cs
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.ImageSharp.Primitives;
-using SixLabors.ImageSharp.Processing.Processors.Drawing;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Adds extensions that allow the filling of regions with various brushes to the type.
- ///
- public static class FillRegionExtensions
- {
- ///
- /// Flood fills the image with the specified brush.
- ///
- /// The image this method extends.
- /// The details how to fill the region of interest.
- /// The .
- public static IImageProcessingContext Fill(this IImageProcessingContext source, IBrush brush) =>
- source.Fill(new GraphicsOptions(), brush);
-
- ///
- /// Flood fills the image with the specified color.
- ///
- /// The image this method extends.
- /// The color.
- /// The .
- public static IImageProcessingContext Fill(this IImageProcessingContext source, Color color) =>
- source.Fill(new SolidBrush(color));
-
- ///
- /// Flood fills the image with in the region with the specified brush.
- ///
- /// The image this method extends.
- /// The brush.
- /// The region.
- /// The .
- public static IImageProcessingContext Fill(this IImageProcessingContext source, IBrush brush, Region region) =>
- source.Fill(new GraphicsOptions(), brush, region);
-
- ///
- /// Flood fills the image with in the region with the specified color.
- ///
- /// The image this method extends.
- /// The options.
- /// The color.
- /// The region.
- /// The .
- public static IImageProcessingContext Fill(
- this IImageProcessingContext source,
- GraphicsOptions options,
- Color color,
- Region region) =>
- source.Fill(options, new SolidBrush(color), region);
-
- ///
- /// Flood fills the image with in the region with the specified color.
- ///
- /// The image this method extends.
- /// The color.
- /// The region.
- /// The .
- public static IImageProcessingContext Fill(this IImageProcessingContext source, Color color, Region region) =>
- source.Fill(new SolidBrush(color), region);
-
- ///
- /// Flood fills the image with in the region with the specified brush.
- ///
- /// The image this method extends.
- /// The graphics options.
- /// The brush.
- /// The region.
- /// The .
- public static IImageProcessingContext Fill(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IBrush brush,
- Region region) =>
- source.ApplyProcessor(new FillRegionProcessor(options, brush, region));
-
- ///
- /// Flood fills the image with the specified brush.
- ///
- /// The image this method extends.
- /// The graphics options.
- /// The details how to fill the region of interest.
- /// The .
- public static IImageProcessingContext Fill(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IBrush brush) =>
- source.ApplyProcessor(new FillProcessor(options, brush));
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/GradientBrush.cs b/src/ImageSharp.Drawing/Processing/GradientBrush.cs
deleted file mode 100644
index 3be56c042..000000000
--- a/src/ImageSharp.Drawing/Processing/GradientBrush.cs
+++ /dev/null
@@ -1,164 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-using System.Numerics;
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Base class for Gradient brushes
- ///
- public abstract class GradientBrush : IBrush
- {
- ///
- /// Defines how the colors are repeated beyond the interval [0..1]
- /// The gradient colors.
- protected GradientBrush(
- GradientRepetitionMode repetitionMode,
- params ColorStop[] colorStops)
- {
- this.RepetitionMode = repetitionMode;
- this.ColorStops = colorStops;
- }
-
- ///
- /// Gets how the colors are repeated beyond the interval [0..1].
- ///
- protected GradientRepetitionMode RepetitionMode { get; }
-
- ///
- /// Gets the list of color stops for this gradient.
- ///
- protected ColorStop[] ColorStops { get; }
-
- ///
- public abstract BrushApplicator CreateApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame source,
- RectangleF region)
- where TPixel : struct, IPixel;
-
- ///
- /// Base class for gradient brush applicators
- ///
- internal abstract class GradientBrushApplicator : BrushApplicator
- where TPixel : struct, IPixel
- {
- private static readonly TPixel Transparent = Color.Transparent.ToPixel();
-
- private readonly ColorStop[] colorStops;
-
- private readonly GradientRepetitionMode repetitionMode;
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The configuration instance to use when performing operations.
- /// The graphics options.
- /// The target image.
- /// An array of color stops sorted by their position.
- /// Defines if and how the gradient should be repeated.
- protected GradientBrushApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame target,
- ColorStop[] colorStops,
- GradientRepetitionMode repetitionMode)
- : base(configuration, options, target)
- {
- this.colorStops = colorStops; // TODO: requires colorStops to be sorted by position - should that be checked?
- this.repetitionMode = repetitionMode;
- }
-
- ///
- internal override TPixel this[int x, int y]
- {
- get
- {
- float positionOnCompleteGradient = this.PositionOnGradient(x + 0.5f, y + 0.5f);
-
- switch (this.repetitionMode)
- {
- case GradientRepetitionMode.None:
- // do nothing. The following could be done, but is not necessary:
- // onLocalGradient = Math.Min(0, Math.Max(1, onLocalGradient));
- break;
- case GradientRepetitionMode.Repeat:
- positionOnCompleteGradient %= 1;
- break;
- case GradientRepetitionMode.Reflect:
- positionOnCompleteGradient %= 2;
- if (positionOnCompleteGradient > 1)
- {
- positionOnCompleteGradient = 2 - positionOnCompleteGradient;
- }
-
- break;
- case GradientRepetitionMode.DontFill:
- if (positionOnCompleteGradient > 1 || positionOnCompleteGradient < 0)
- {
- return Transparent;
- }
-
- break;
- default:
- throw new ArgumentOutOfRangeException();
- }
-
- (ColorStop from, ColorStop to) = this.GetGradientSegment(positionOnCompleteGradient);
-
- if (from.Color.Equals(to.Color))
- {
- return from.Color.ToPixel();
- }
- else
- {
- float onLocalGradient = (positionOnCompleteGradient - from.Ratio) / (to.Ratio - from.Ratio);
- return new Color(Vector4.Lerp((Vector4)from.Color, (Vector4)to.Color, onLocalGradient)).ToPixel();
- }
- }
- }
-
- ///
- /// calculates the position on the gradient for a given point.
- /// This method is abstract as it's content depends on the shape of the gradient.
- ///
- /// The x-coordinate of the point.
- /// The y-coordinate of the point.
- ///
- /// The position the given point has on the gradient.
- /// The position is not bound to the [0..1] interval.
- /// Values outside of that interval may be treated differently,
- /// e.g. for the enum.
- ///
- protected abstract float PositionOnGradient(float x, float y);
-
- private (ColorStop from, ColorStop to) GetGradientSegment(
- float positionOnCompleteGradient)
- {
- ColorStop localGradientFrom = this.colorStops[0];
- ColorStop localGradientTo = default;
-
- // TODO: ensure colorStops has at least 2 items (technically 1 would be okay, but that's no gradient)
- foreach (ColorStop colorStop in this.colorStops)
- {
- localGradientTo = colorStop;
-
- if (colorStop.Ratio > positionOnCompleteGradient)
- {
- // we're done here, so break it!
- break;
- }
-
- localGradientFrom = localGradientTo;
- }
-
- return (localGradientFrom, localGradientTo);
- }
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/GradientRepetitionMode.cs b/src/ImageSharp.Drawing/Processing/GradientRepetitionMode.cs
deleted file mode 100644
index 6aed8a030..000000000
--- a/src/ImageSharp.Drawing/Processing/GradientRepetitionMode.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Modes to repeat a gradient.
- ///
- public enum GradientRepetitionMode
- {
- ///
- /// don't repeat, keep the color of start and end beyond those points stable.
- ///
- None,
-
- ///
- /// Repeat the gradient.
- /// If it's a black-white gradient, with Repeat it will be Black->{gray}->White|Black->{gray}->White|...
- ///
- Repeat,
-
- ///
- /// Reflect the gradient.
- /// Similar to , but each other repetition uses inverse order of s.
- /// Used on a Black-White gradient, Reflect leads to Black->{gray}->White->{gray}->White...
- ///
- Reflect,
-
- ///
- /// With DontFill a gradient does not touch any pixel beyond it's borders.
- /// For the this is beyond the orthogonal through start and end,
- /// TODO For the cref="PolygonalGradientBrush" it's outside the polygon,
- /// For and it's beyond 1.0.
- ///
- DontFill
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/IBrush.cs b/src/ImageSharp.Drawing/Processing/IBrush.cs
deleted file mode 100644
index f4c7ef7cb..000000000
--- a/src/ImageSharp.Drawing/Processing/IBrush.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Brush represents a logical configuration of a brush which can be used to source pixel colors
- ///
- ///
- /// A brush is a simple class that will return an that will perform the
- /// logic for retrieving pixel values for specific locations.
- ///
- public interface IBrush
- {
- ///
- /// Creates the applicator for this brush.
- ///
- /// The pixel type.
- /// The configuration instance to use when performing operations.
- /// The graphic options.
- /// The source image.
- /// The region the brush will be applied to.
- ///
- /// The for this brush.
- ///
- ///
- /// The when being applied to things like shapes would usually be the
- /// bounding box of the shape not necessarily the bounds of the whole image.
- ///
- BrushApplicator CreateApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame source,
- RectangleF region)
- where TPixel : struct, IPixel;
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/IPen.cs b/src/ImageSharp.Drawing/Processing/IPen.cs
deleted file mode 100644
index 0efcfc108..000000000
--- a/src/ImageSharp.Drawing/Processing/IPen.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Interface representing the pattern and size of the stroke to apply with a Pen.
- ///
- public interface IPen
- {
- ///
- /// Gets the stroke fill.
- ///
- IBrush StrokeFill { get; }
-
- ///
- /// Gets the width to apply to the stroke
- ///
- float StrokeWidth { get; }
-
- ///
- /// Gets the stoke pattern.
- ///
- ReadOnlySpan StrokePattern { get; }
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/ImageBrush.cs b/src/ImageSharp.Drawing/Processing/ImageBrush.cs
deleted file mode 100644
index e38614070..000000000
--- a/src/ImageSharp.Drawing/Processing/ImageBrush.cs
+++ /dev/null
@@ -1,173 +0,0 @@
-// 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.PixelFormats;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Provides an implementation of an image brush for painting images within areas.
- ///
- public class ImageBrush : IBrush
- {
- ///
- /// The image to paint.
- ///
- private readonly Image image;
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The image.
- public ImageBrush(Image image)
- {
- this.image = image;
- }
-
- ///
- public BrushApplicator CreateApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame source,
- RectangleF region)
- where TPixel : struct, IPixel
- {
- if (this.image is Image specificImage)
- {
- return new ImageBrushApplicator(configuration, options, source, specificImage, region, false);
- }
-
- specificImage = this.image.CloneAs();
-
- return new ImageBrushApplicator(configuration, options, source, specificImage, region, true);
- }
-
- ///
- /// The image brush applicator.
- ///
- private class ImageBrushApplicator : BrushApplicator
- where TPixel : struct, IPixel
- {
- private ImageFrame sourceFrame;
-
- private Image sourceImage;
-
- private readonly bool shouldDisposeImage;
-
- ///
- /// The y-length.
- ///
- private readonly int yLength;
-
- ///
- /// The x-length.
- ///
- private readonly int xLength;
-
- ///
- /// The Y offset.
- ///
- private readonly int offsetY;
-
- ///
- /// The X offset.
- ///
- private readonly int offsetX;
-
- private bool isDisposed;
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The configuration instance to use when performing operations.
- /// The graphics options.
- /// The target image.
- /// The image.
- /// The region.
- /// Whether to dispose the image on disposal of the applicator.
- public ImageBrushApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame target,
- Image image,
- RectangleF region,
- bool shouldDisposeImage)
- : base(configuration, options, target)
- {
- this.sourceImage = image;
- this.sourceFrame = image.Frames.RootFrame;
- this.shouldDisposeImage = shouldDisposeImage;
- this.xLength = image.Width;
- this.yLength = image.Height;
- this.offsetY = (int)MathF.Max(MathF.Floor(region.Top), 0);
- this.offsetX = (int)MathF.Max(MathF.Floor(region.Left), 0);
- }
-
- ///
- internal override TPixel this[int x, int y]
- {
- get
- {
- int srcX = (x - this.offsetX) % this.xLength;
- int srcY = (y - this.offsetY) % this.yLength;
- return this.sourceFrame[srcX, srcY];
- }
- }
-
- ///
- protected override void Dispose(bool disposing)
- {
- if (this.isDisposed)
- {
- return;
- }
-
- if (disposing && this.shouldDisposeImage)
- {
- this.sourceImage?.Dispose();
- }
-
- this.sourceImage = null;
- this.sourceFrame = null;
- this.isDisposed = true;
- }
-
- ///
- internal override void Apply(Span scanline, int x, int y)
- {
- // Create a span for colors
- using (IMemoryOwner amountBuffer = this.Target.MemoryAllocator.Allocate(scanline.Length))
- using (IMemoryOwner overlay = this.Target.MemoryAllocator.Allocate(scanline.Length))
- {
- Span amountSpan = amountBuffer.Memory.Span;
- Span overlaySpan = overlay.Memory.Span;
-
- int sourceY = (y - this.offsetY) % this.yLength;
- int offsetX = x - this.offsetX;
- Span sourceRow = this.sourceFrame.GetPixelRowSpan(sourceY);
-
- for (int i = 0; i < scanline.Length; i++)
- {
- amountSpan[i] = scanline[i] * this.Options.BlendPercentage;
-
- int sourceX = (i + offsetX) % this.xLength;
- overlaySpan[i] = sourceRow[sourceX];
- }
-
- Span destinationRow = this.Target.GetPixelRowSpan(y).Slice(x, scanline.Length);
- this.Blender.Blend(
- this.Configuration,
- destinationRow,
- destinationRow,
- overlaySpan,
- amountSpan);
- }
- }
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/LinearGradientBrush.cs b/src/ImageSharp.Drawing/Processing/LinearGradientBrush.cs
deleted file mode 100644
index 044bee72c..000000000
--- a/src/ImageSharp.Drawing/Processing/LinearGradientBrush.cs
+++ /dev/null
@@ -1,160 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Provides an implementation of a brush for painting linear gradients within areas.
- /// Supported right now:
- /// - a set of colors in relative distances to each other.
- ///
- public sealed class LinearGradientBrush : GradientBrush
- {
- private readonly PointF p1;
-
- private readonly PointF p2;
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// Start point
- /// End point
- /// defines how colors are repeated.
- ///
- public LinearGradientBrush(
- PointF p1,
- PointF p2,
- GradientRepetitionMode repetitionMode,
- params ColorStop[] colorStops)
- : base(repetitionMode, colorStops)
- {
- this.p1 = p1;
- this.p2 = p2;
- }
-
- ///
- public override BrushApplicator CreateApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame source,
- RectangleF region) =>
- new LinearGradientBrushApplicator(
- configuration,
- options,
- source,
- this.p1,
- this.p2,
- this.ColorStops,
- this.RepetitionMode);
-
- ///
- /// The linear gradient brush applicator.
- ///
- private sealed class LinearGradientBrushApplicator : GradientBrushApplicator
- where TPixel : struct, IPixel
- {
- private readonly PointF start;
-
- private readonly PointF end;
-
- ///
- /// the vector along the gradient, x component
- ///
- private readonly float alongX;
-
- ///
- /// the vector along the gradient, y component
- ///
- private readonly float alongY;
-
- ///
- /// the vector perpendicular to the gradient, y component
- ///
- private readonly float acrossY;
-
- ///
- /// the vector perpendicular to the gradient, x component
- ///
- private readonly float acrossX;
-
- ///
- /// the result of ^2 + ^2
- ///
- private readonly float alongsSquared;
-
- ///
- /// the length of the defined gradient (between source and end)
- ///
- private readonly float length;
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The configuration instance to use when performing operations.
- /// The graphics options.
- /// The source image.
- /// The start point of the gradient.
- /// The end point of the gradient.
- /// A tuple list of colors and their respective position between 0 and 1 on the line.
- /// Defines how the gradient colors are repeated.
- public LinearGradientBrushApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame source,
- PointF start,
- PointF end,
- ColorStop[] colorStops,
- GradientRepetitionMode repetitionMode)
- : base(configuration, options, source, colorStops, repetitionMode)
- {
- this.start = start;
- this.end = end;
-
- // the along vector:
- this.alongX = this.end.X - this.start.X;
- this.alongY = this.end.Y - this.start.Y;
-
- // the cross vector:
- this.acrossX = this.alongY;
- this.acrossY = -this.alongX;
-
- // some helpers:
- this.alongsSquared = (this.alongX * this.alongX) + (this.alongY * this.alongY);
- this.length = MathF.Sqrt(this.alongsSquared);
- }
-
- protected override float PositionOnGradient(float x, float y)
- {
- if (this.acrossX == 0)
- {
- return (x - this.start.X) / (this.end.X - this.start.X);
- }
- else if (this.acrossY == 0)
- {
- return (y - this.start.Y) / (this.end.Y - this.start.Y);
- }
- else
- {
- float deltaX = x - this.start.X;
- float deltaY = y - this.start.Y;
- float k = ((this.alongY * deltaX) - (this.alongX * deltaY)) / this.alongsSquared;
-
- // point on the line:
- float x4 = x - (k * this.alongY);
- float y4 = y + (k * this.alongX);
-
- // get distance from (x4,y4) to start
- float distance = MathF.Sqrt(MathF.Pow(x4 - this.start.X, 2) + MathF.Pow(y4 - this.start.Y, 2));
-
- // get and return ratio
- return distance / this.length;
- }
- }
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/PathGradientBrush.cs b/src/ImageSharp.Drawing/Processing/PathGradientBrush.cs
deleted file mode 100644
index 126567899..000000000
--- a/src/ImageSharp.Drawing/Processing/PathGradientBrush.cs
+++ /dev/null
@@ -1,309 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-using System.Buffers;
-using System.Collections.Generic;
-using System.Linq;
-using System.Numerics;
-
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.Memory;
-using SixLabors.Primitives;
-using SixLabors.Shapes;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Provides an implementation of a brush for painting gradients between multiple color positions in 2D coordinates.
- /// It works similarly with the class in System.Drawing.Drawing2D of the same name.
- ///
- public sealed class PathGradientBrush : IBrush
- {
- private readonly IList edges;
-
- private readonly Color centerColor;
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// Points that constitute a polygon that represents the gradient area.
- /// Array of colors that correspond to each point in the polygon.
- /// Color at the center of the gradient area to which the other colors converge.
- public PathGradientBrush(PointF[] points, Color[] colors, Color centerColor)
- {
- if (points == null)
- {
- throw new ArgumentNullException(nameof(points));
- }
-
- if (points.Length < 3)
- {
- throw new ArgumentOutOfRangeException(
- nameof(points),
- "There must be at least 3 lines to construct a path gradient brush.");
- }
-
- if (colors == null)
- {
- throw new ArgumentNullException(nameof(colors));
- }
-
- if (colors.Length == 0)
- {
- throw new ArgumentOutOfRangeException(
- nameof(colors),
- "One or more color is needed to construct a path gradient brush.");
- }
-
- int size = points.Length;
-
- var lines = new ILineSegment[size];
-
- for (int i = 0; i < size; i++)
- {
- lines[i] = new LinearLineSegment(points[i % size], points[(i + 1) % size]);
- }
-
- this.centerColor = centerColor;
-
- Color ColorAt(int index) => colors[index % colors.Length];
-
- this.edges = lines.Select(s => new Path(s))
- .Select((path, i) => new Edge(path, ColorAt(i), ColorAt(i + 1))).ToList();
- }
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// Points that constitute a polygon that represents the gradient area.
- /// Array of colors that correspond to each point in the polygon.
- public PathGradientBrush(PointF[] points, Color[] colors)
- : this(points, colors, CalculateCenterColor(colors))
- {
- }
-
- ///
- public BrushApplicator CreateApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame source,
- RectangleF region)
- where TPixel : struct, IPixel
- {
- return new PathGradientBrushApplicator(configuration, options, source, this.edges, this.centerColor);
- }
-
- private static Color CalculateCenterColor(Color[] colors)
- {
- if (colors == null)
- {
- throw new ArgumentNullException(nameof(colors));
- }
-
- if (colors.Length == 0)
- {
- throw new ArgumentOutOfRangeException(
- nameof(colors),
- "One or more color is needed to construct a path gradient brush.");
- }
-
- return new Color(colors.Select(c => (Vector4)c).Aggregate((p1, p2) => p1 + p2) / colors.Length);
- }
-
- private static float DistanceBetween(PointF p1, PointF p2) => ((Vector2)(p2 - p1)).Length();
-
- private struct Intersection
- {
- public Intersection(PointF point, float distance)
- {
- this.Point = point;
- this.Distance = distance;
- }
-
- public PointF Point { get; }
-
- public float Distance { get; }
- }
-
- ///
- /// An edge of the polygon that represents the gradient area.
- ///
- private class Edge
- {
- private readonly Path path;
-
- private readonly float length;
-
- public Edge(Path path, Color startColor, Color endColor)
- {
- this.path = path;
-
- Vector2[] points = path.LineSegments.SelectMany(s => s.Flatten()).Select(p => (Vector2)p).ToArray();
-
- this.Start = points[0];
- this.StartColor = (Vector4)startColor;
-
- this.End = points.Last();
- this.EndColor = (Vector4)endColor;
-
- this.length = DistanceBetween(this.End, this.Start);
- }
-
- public PointF Start { get; }
-
- public Vector4 StartColor { get; }
-
- public PointF End { get; }
-
- public Vector4 EndColor { get; }
-
- public Intersection? FindIntersection(PointF start, PointF end, MemoryAllocator allocator)
- {
- // TODO: The number of max intersections is upper bound to the number of nodes of the path.
- // Normally these numbers would be small and could potentially be stackalloc rather than pooled.
- // Investigate performance beifit of checking length and choosing approach.
- using (IMemoryOwner memory = allocator.Allocate(this.path.MaxIntersections))
- {
- Span buffer = memory.Memory.Span;
- int intersections = this.path.FindIntersections(start, end, buffer);
-
- if (intersections == 0)
- {
- return null;
- }
-
- buffer = buffer.Slice(0, intersections);
-
- PointF minPoint = buffer[0];
- var min = new Intersection(minPoint, ((Vector2)(minPoint - start)).LengthSquared());
- for (int i = 1; i < buffer.Length; i++)
- {
- PointF point = buffer[i];
- var current = new Intersection(point, ((Vector2)(point - start)).LengthSquared());
-
- if (min.Distance > current.Distance)
- {
- min = current;
- }
- }
-
- return min;
- }
- }
-
- public Vector4 ColorAt(float distance)
- {
- float ratio = this.length > 0 ? distance / this.length : 0;
-
- return Vector4.Lerp(this.StartColor, this.EndColor, ratio);
- }
-
- public Vector4 ColorAt(PointF point) => this.ColorAt(DistanceBetween(point, this.Start));
- }
-
- ///
- /// The path gradient brush applicator.
- ///
- private class PathGradientBrushApplicator : BrushApplicator
- where TPixel : struct, IPixel
- {
- private readonly PointF center;
-
- private readonly Vector4 centerColor;
-
- private readonly float maxDistance;
-
- private readonly IList edges;
-
- private readonly TPixel centerPixel;
-
- private readonly TPixel transparentPixel;
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The configuration instance to use when performing operations.
- /// The graphics options.
- /// The source image.
- /// Edges of the polygon.
- /// Color at the center of the gradient area to which the other colors converge.
- public PathGradientBrushApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame source,
- IList edges,
- Color centerColor)
- : base(configuration, options, source)
- {
- this.edges = edges;
- PointF[] points = edges.Select(s => s.Start).ToArray();
-
- this.center = points.Aggregate((p1, p2) => p1 + p2) / edges.Count;
- this.centerColor = (Vector4)centerColor;
- this.centerPixel = centerColor.ToPixel();
-
- this.maxDistance = points.Select(p => (Vector2)(p - this.center)).Max(d => d.Length());
-
- this.transparentPixel = Color.Transparent.ToPixel();
- }
-
- ///
- internal override TPixel this[int x, int y]
- {
- get
- {
- var point = new PointF(x, y);
-
- if (point == this.center)
- {
- return this.centerPixel;
- }
-
- var direction = Vector2.Normalize(point - this.center);
- PointF end = point + (PointF)(direction * this.maxDistance);
-
- (Edge edge, Intersection? info) = this.FindIntersection(point, end);
-
- if (!info.HasValue)
- {
- return this.transparentPixel;
- }
-
- PointF intersection = info.Value.Point;
- Vector4 edgeColor = edge.ColorAt(intersection);
-
- float length = DistanceBetween(intersection, this.center);
- float ratio = length > 0 ? DistanceBetween(intersection, point) / length : 0;
-
- var color = Vector4.Lerp(edgeColor, this.centerColor, ratio);
-
- return new Color(color).ToPixel();
- }
- }
-
- private (Edge edge, Intersection? info) FindIntersection(PointF start, PointF end)
- {
- (Edge edge, Intersection? info) closest = default;
-
- MemoryAllocator allocator = this.Target.MemoryAllocator;
- foreach (Edge edge in this.edges)
- {
- Intersection? intersection = edge.FindIntersection(start, end, allocator);
-
- if (!intersection.HasValue)
- {
- continue;
- }
-
- if (closest.info == null || closest.info.Value.Distance > intersection.Value.Distance)
- {
- closest = (edge, intersection);
- }
- }
-
- return closest;
- }
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/PatternBrush.cs b/src/ImageSharp.Drawing/Processing/PatternBrush.cs
deleted file mode 100644
index 726df5a79..000000000
--- a/src/ImageSharp.Drawing/Processing/PatternBrush.cs
+++ /dev/null
@@ -1,178 +0,0 @@
-// 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.PixelFormats;
-using SixLabors.ImageSharp.Primitives;
-using SixLabors.Memory;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Provides an implementation of a pattern brush for painting patterns.
- ///
- ///
- /// The patterns that are used to create a custom pattern brush are made up of a repeating matrix of flags,
- /// where each flag denotes whether to draw the foreground color or the background color.
- /// so to create a new bool[,] with your flags
- ///
- /// For example if you wanted to create a diagonal line that repeat every 4 pixels you would use a pattern like so
- /// 1000
- /// 0100
- /// 0010
- /// 0001
- ///
- ///
- /// or you want a horizontal stripe which is 3 pixels apart you would use a pattern like
- /// 1
- /// 0
- /// 0
- ///
- ///
- public class PatternBrush : IBrush
- {
- ///
- /// The pattern.
- ///
- private readonly DenseMatrix pattern;
- private readonly DenseMatrix patternVector;
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// Color of the fore.
- /// Color of the back.
- /// The pattern.
- public PatternBrush(Color foreColor, Color backColor, bool[,] pattern)
- : this(foreColor, backColor, new DenseMatrix(pattern))
- {
- }
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// Color of the fore.
- /// Color of the back.
- /// The pattern.
- internal PatternBrush(Color foreColor, Color backColor, in DenseMatrix pattern)
- {
- var foreColorVector = (Vector4)foreColor;
- var backColorVector = (Vector4)backColor;
- this.pattern = new DenseMatrix(pattern.Columns, pattern.Rows);
- this.patternVector = new DenseMatrix(pattern.Columns, pattern.Rows);
- for (int i = 0; i < pattern.Data.Length; i++)
- {
- if (pattern.Data[i])
- {
- this.pattern.Data[i] = foreColor;
- this.patternVector.Data[i] = foreColorVector;
- }
- else
- {
- this.pattern.Data[i] = backColor;
- this.patternVector.Data[i] = backColorVector;
- }
- }
- }
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The brush.
- internal PatternBrush(PatternBrush brush)
- {
- this.pattern = brush.pattern;
- this.patternVector = brush.patternVector;
- }
-
- ///
- public BrushApplicator CreateApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame source,
- RectangleF region)
- where TPixel : struct, IPixel =>
- new PatternBrushApplicator(
- configuration,
- options,
- source,
- this.pattern.ToPixelMatrix(configuration));
-
- ///
- /// The pattern brush applicator.
- ///
- private class PatternBrushApplicator : BrushApplicator
- where TPixel : struct, IPixel
- {
- ///
- /// The pattern.
- ///
- private readonly DenseMatrix pattern;
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The configuration instance to use when performing operations.
- /// The graphics options.
- /// The source image.
- /// The pattern.
- public PatternBrushApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame source,
- in DenseMatrix pattern)
- : base(configuration, options, source)
- {
- this.pattern = pattern;
- }
-
- ///
- internal override TPixel this[int x, int y]
- {
- get
- {
- x %= this.pattern.Columns;
- y %= this.pattern.Rows;
-
- // 2d array index at row/column
- return this.pattern[y, x];
- }
- }
-
- ///
- internal override void Apply(Span scanline, int x, int y)
- {
- int patternY = y % this.pattern.Rows;
- MemoryAllocator memoryAllocator = this.Target.MemoryAllocator;
-
- using (IMemoryOwner amountBuffer = memoryAllocator.Allocate(scanline.Length))
- using (IMemoryOwner overlay = memoryAllocator.Allocate(scanline.Length))
- {
- Span amountSpan = amountBuffer.Memory.Span;
- Span overlaySpan = overlay.Memory.Span;
-
- for (int i = 0; i < scanline.Length; i++)
- {
- amountSpan[i] = NumberUtils.ClampFloat(scanline[i] * this.Options.BlendPercentage, 0, 1F);
-
- int patternX = (x + i) % this.pattern.Columns;
- overlaySpan[i] = this.pattern[patternY, patternX];
- }
-
- Span destinationRow = this.Target.GetPixelRowSpan(y).Slice(x, scanline.Length);
- this.Blender.Blend(
- this.Configuration,
- destinationRow,
- destinationRow,
- overlaySpan,
- amountSpan);
- }
- }
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/Pen.cs b/src/ImageSharp.Drawing/Processing/Pen.cs
deleted file mode 100644
index ebad687d5..000000000
--- a/src/ImageSharp.Drawing/Processing/Pen.cs
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Provides a pen that can apply a pattern to a line with a set brush and thickness
- ///
- ///
- /// The pattern will be in to the form of new float[]{ 1f, 2f, 0.5f} this will be
- /// converted into a pattern that is 3.5 times longer that the width with 3 sections
- /// section 1 will be width long (making a square) and will be filled by the brush
- /// section 2 will be width * 2 long and will be empty
- /// section 3 will be width/2 long and will be filled
- /// the the pattern will immediately repeat without gap.
- ///
- public class Pen : IPen
- {
- private readonly float[] pattern;
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The color.
- /// The width.
- /// The pattern.
- public Pen(Color color, float width, float[] pattern)
- : this(new SolidBrush(color), width, pattern)
- {
- }
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The brush.
- /// The width.
- /// The pattern.
- public Pen(IBrush brush, float width, float[] pattern)
- {
- this.StrokeFill = brush;
- this.StrokeWidth = width;
- this.pattern = pattern;
- }
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The color.
- /// The width.
- public Pen(Color color, float width)
- : this(new SolidBrush(color), width)
- {
- }
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The brush.
- /// The width.
- public Pen(IBrush brush, float width)
- : this(brush, width, Pens.EmptyPattern)
- {
- }
-
- ///
- public IBrush StrokeFill { get; }
-
- ///
- public float StrokeWidth { get; }
-
- ///
- public ReadOnlySpan StrokePattern => this.pattern;
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/Pens.cs b/src/ImageSharp.Drawing/Processing/Pens.cs
deleted file mode 100644
index e60b5b6c7..000000000
--- a/src/ImageSharp.Drawing/Processing/Pens.cs
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Contains a collection of common Pen styles
- ///
- public static class Pens
- {
- private static readonly float[] DashDotPattern = { 3f, 1f, 1f, 1f };
- private static readonly float[] DashDotDotPattern = { 3f, 1f, 1f, 1f, 1f, 1f };
- private static readonly float[] DottedPattern = { 1f, 1f };
- private static readonly float[] DashedPattern = { 3f, 1f };
- internal static readonly float[] EmptyPattern = new float[0];
-
- ///
- /// Create a solid pen with out any drawing patterns
- ///
- /// The color.
- /// The width.
- /// The Pen
- public static Pen Solid(Color color, float width) => new Pen(color, width);
-
- ///
- /// Create a solid pen with out any drawing patterns
- ///
- /// The brush.
- /// The width.
- /// The Pen
- public static Pen Solid(IBrush brush, float width) => new Pen(brush, width);
-
- ///
- /// Create a pen with a 'Dash' drawing patterns
- ///
- /// The color.
- /// The width.
- /// The Pen
- public static Pen Dash(Color color, float width) => new Pen(color, width, DashedPattern);
-
- ///
- /// Create a pen with a 'Dash' drawing patterns
- ///
- /// The brush.
- /// The width.
- /// The Pen
- public static Pen Dash(IBrush brush, float width) => new Pen(brush, width, DashedPattern);
-
- ///
- /// Create a pen with a 'Dot' drawing patterns
- ///
- /// The color.
- /// The width.
- /// The Pen
- public static Pen Dot(Color color, float width) => new Pen(color, width, DottedPattern);
-
- ///
- /// Create a pen with a 'Dot' drawing patterns
- ///
- /// The brush.
- /// The width.
- /// The Pen
- public static Pen Dot(IBrush brush, float width) => new Pen(brush, width, DottedPattern);
-
- ///
- /// Create a pen with a 'Dash Dot' drawing patterns
- ///
- /// The color.
- /// The width.
- /// The Pen
- public static Pen DashDot(Color color, float width) => new Pen(color, width, DashDotPattern);
-
- ///
- /// Create a pen with a 'Dash Dot' drawing patterns
- ///
- /// The brush.
- /// The width.
- /// The Pen
- public static Pen DashDot(IBrush brush, float width) => new Pen(brush, width, DashDotPattern);
-
- ///
- /// Create a pen with a 'Dash Dot Dot' drawing patterns
- ///
- /// The color.
- /// The width.
- /// The Pen
- public static Pen DashDotDot(Color color, float width) => new Pen(color, width, DashDotDotPattern);
-
- ///
- /// Create a pen with a 'Dash Dot Dot' drawing patterns
- ///
- /// The brush.
- /// The width.
- /// The Pen
- public static Pen DashDotDot(IBrush brush, float width) => new Pen(brush, width, DashDotDotPattern);
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillProcessor.cs b/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillProcessor.cs
deleted file mode 100644
index c94e0c179..000000000
--- a/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillProcessor.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Processing.Processors.Drawing
-{
- ///
- /// Defines a processor to fill an with the given
- /// using blending defined by the given .
- ///
- public class FillProcessor : IImageProcessor
- {
- ///
- /// Initializes a new instance of the class.
- ///
- /// The defining how to blend the brush pixels over the image pixels.
- /// The brush to use for filling.
- public FillProcessor(GraphicsOptions options, IBrush brush)
- {
- this.Brush = brush;
- this.Options = options;
- }
-
- ///
- /// Gets the used for filling the destination image.
- ///
- public IBrush Brush { get; }
-
- ///
- /// Gets the defining how to blend the brush pixels over the image pixels.
- ///
- public GraphicsOptions Options { get; }
-
- ///
- public IImageProcessor CreatePixelSpecificProcessor(Configuration configuration, Image source, Rectangle sourceRectangle)
- where TPixel : struct, IPixel
- => new FillProcessor(configuration, this, source, sourceRectangle);
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillProcessor{TPixel}.cs b/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillProcessor{TPixel}.cs
deleted file mode 100644
index ca639cd14..000000000
--- a/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillProcessor{TPixel}.cs
+++ /dev/null
@@ -1,122 +0,0 @@
-// 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.Advanced.ParallelUtils;
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Processing.Processors.Drawing
-{
- ///
- /// Using the brush as a source of pixels colors blends the brush color with source.
- ///
- /// The pixel format.
- internal class FillProcessor : ImageProcessor
- where TPixel : struct, IPixel
- {
- private readonly FillProcessor definition;
-
- public FillProcessor(Configuration configuration, FillProcessor definition, Image source, Rectangle sourceRectangle)
- : base(configuration, source, sourceRectangle)
- {
- this.definition = definition;
- }
-
- ///
- protected override void OnFrameApply(ImageFrame source)
- {
- Rectangle sourceRectangle = this.SourceRectangle;
- Configuration configuration = this.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;
-
- var workingRect = Rectangle.FromLTRB(minX, minY, maxX, maxY);
-
- IBrush brush = this.definition.Brush;
- GraphicsOptions options = this.definition.Options;
-
- // If there's no reason for blending, then avoid it.
- if (this.IsSolidBrushWithoutBlending(out SolidBrush solidBrush))
- {
- ParallelExecutionSettings parallelSettings = ParallelExecutionSettings.FromConfiguration(configuration)
- .MultiplyMinimumPixelsPerTask(4);
-
- TPixel colorPixel = solidBrush.Color.ToPixel();
-
- ParallelHelper.IterateRows(
- workingRect,
- parallelSettings,
- rows =>
- {
- for (int y = rows.Min; y < rows.Max; y++)
- {
- source.GetPixelRowSpan(y).Slice(minX, width).Fill(colorPixel);
- }
- });
- }
- else
- {
- // Reset offset if necessary.
- if (minX > 0)
- {
- startX = 0;
- }
-
- if (minY > 0)
- {
- startY = 0;
- }
-
- using (IMemoryOwner amount = source.MemoryAllocator.Allocate(width))
- using (BrushApplicator applicator = brush.CreateApplicator(
- configuration,
- options,
- source,
- sourceRectangle))
- {
- amount.Memory.Span.Fill(1F);
-
- ParallelHelper.IterateRows(
- workingRect,
- configuration,
- rows =>
- {
- for (int y = rows.Min; y < rows.Max; y++)
- {
- int offsetY = y - startY;
- int offsetX = minX - startX;
-
- applicator.Apply(amount.Memory.Span, offsetX, offsetY);
- }
- });
- }
- }
- }
-
- private bool IsSolidBrushWithoutBlending(out SolidBrush solidBrush)
- {
- solidBrush = this.definition.Brush as SolidBrush;
-
- if (solidBrush is null)
- {
- return false;
- }
-
- return this.definition.Options.IsOpaqueColorWithoutBlending(solidBrush.Color);
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillRegionProcessor.cs b/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillRegionProcessor.cs
deleted file mode 100644
index 6cfeb785c..000000000
--- a/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillRegionProcessor.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.ImageSharp.Primitives;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Processing.Processors.Drawing
-{
- ///
- /// Defines a processor to fill pixels withing a given
- /// with the given and blending defined by the given .
- ///
- public class FillRegionProcessor : IImageProcessor
- {
- ///
- /// Initializes a new instance of the class.
- ///
- /// The graphics options.
- /// The details how to fill the region of interest.
- /// The region of interest to be filled.
- public FillRegionProcessor(GraphicsOptions options, IBrush brush, Region region)
- {
- this.Region = region;
- this.Brush = brush;
- this.Options = options;
- }
-
- ///
- /// Gets the used for filling the destination image.
- ///
- public IBrush Brush { get; }
-
- ///
- /// Gets the region that this processor applies to.
- ///
- public Region Region { get; }
-
- ///
- /// Gets the defining how to blend the brush pixels over the image pixels.
- ///
- public GraphicsOptions Options { get; }
-
- ///
- public IImageProcessor CreatePixelSpecificProcessor(Configuration configuration, Image source, Rectangle sourceRectangle)
- where TPixel : struct, IPixel
- => new FillRegionProcessor(configuration, this, source, sourceRectangle);
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillRegionProcessor{TPixel}.cs b/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillRegionProcessor{TPixel}.cs
deleted file mode 100644
index 7d632ad23..000000000
--- a/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillRegionProcessor{TPixel}.cs
+++ /dev/null
@@ -1,197 +0,0 @@
-// 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.PixelFormats;
-using SixLabors.ImageSharp.Primitives;
-using SixLabors.ImageSharp.Utils;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Processing.Processors.Drawing
-{
- ///
- /// Using a brush and a shape fills shape with contents of brush the
- ///
- /// The type of the color.
- ///
- internal class FillRegionProcessor : ImageProcessor
- where TPixel : struct, IPixel
- {
- private readonly FillRegionProcessor definition;
-
- public FillRegionProcessor(Configuration configuration, FillRegionProcessor definition, Image source, Rectangle sourceRectangle)
- : base(configuration, source, sourceRectangle)
- {
- this.definition = definition;
- }
-
- ///
- protected override void OnFrameApply(ImageFrame source)
- {
- Configuration configuration = this.Configuration;
- GraphicsOptions options = this.definition.Options;
- IBrush brush = this.definition.Brush;
- Region region = this.definition.Region;
- Rectangle rect = region.Bounds;
-
- // Align start/end positions.
- int minX = Math.Max(0, rect.Left);
- int maxX = Math.Min(source.Width, rect.Right);
- int minY = Math.Max(0, rect.Top);
- int maxY = Math.Min(source.Height, rect.Bottom);
- if (minX >= maxX)
- {
- return; // no effect inside image;
- }
-
- if (minY >= maxY)
- {
- return; // no effect inside image;
- }
-
- int maxIntersections = region.MaxIntersections;
- float subpixelCount = 4;
-
- // we need to offset the pixel grid to account for when we outline a path.
- // basically if the line is [1,2] => [3,2] then when outlining at 1 we end up with a region of [0.5,1.5],[1.5, 1.5],[3.5,2.5],[2.5,2.5]
- // and this can cause missed fills when not using antialiasing.so we offset the pixel grid by 0.5 in the x & y direction thus causing the#
- // region to align with the pixel grid.
- float offset = 0.5f;
- if (options.Antialias)
- {
- offset = 0f; // we are antialiasing skip offsetting as real antialiasing should take care of offset.
- subpixelCount = options.AntialiasSubpixelDepth;
- if (subpixelCount < 4)
- {
- subpixelCount = 4;
- }
- }
-
- using (BrushApplicator applicator = brush.CreateApplicator(configuration, options, source, rect))
- {
- int scanlineWidth = maxX - minX;
- using (IMemoryOwner bBuffer = source.MemoryAllocator.Allocate(maxIntersections))
- using (IMemoryOwner bScanline = source.MemoryAllocator.Allocate(scanlineWidth))
- {
- bool scanlineDirty = true;
- float subpixelFraction = 1f / subpixelCount;
- float subpixelFractionPoint = subpixelFraction / subpixelCount;
-
- Span buffer = bBuffer.Memory.Span;
- Span scanline = bScanline.Memory.Span;
-
- bool isSolidBrushWithoutBlending = this.IsSolidBrushWithoutBlending(out SolidBrush solidBrush);
- TPixel solidBrushColor = isSolidBrushWithoutBlending ? solidBrush.Color.ToPixel() : default;
-
- for (int y = minY; y < maxY; y++)
- {
- if (scanlineDirty)
- {
- scanline.Clear();
- scanlineDirty = false;
- }
-
- float yPlusOne = y + 1;
- for (float subPixel = y; subPixel < yPlusOne; subPixel += subpixelFraction)
- {
- int pointsFound = region.Scan(subPixel + offset, buffer, configuration);
- if (pointsFound == 0)
- {
- // nothing on this line, skip
- continue;
- }
-
- QuickSort.Sort(buffer.Slice(0, pointsFound));
-
- for (int point = 0; point < pointsFound && point < buffer.Length - 1; point += 2)
- {
- // points will be paired up
- float scanStart = buffer[point] - minX;
- float scanEnd = buffer[point + 1] - minX;
- int startX = (int)MathF.Floor(scanStart + offset);
- int endX = (int)MathF.Floor(scanEnd + offset);
-
- if (startX >= 0 && startX < scanline.Length)
- {
- for (float x = scanStart; x < startX + 1; x += subpixelFraction)
- {
- scanline[startX] += subpixelFractionPoint;
- scanlineDirty = true;
- }
- }
-
- if (endX >= 0 && endX < scanline.Length)
- {
- for (float x = endX; x < scanEnd; x += subpixelFraction)
- {
- scanline[endX] += subpixelFractionPoint;
- scanlineDirty = true;
- }
- }
-
- int nextX = startX + 1;
- endX = Math.Min(endX, scanline.Length); // reduce to end to the right edge
- nextX = Math.Max(nextX, 0);
- for (int x = nextX; x < endX; x++)
- {
- scanline[x] += subpixelFraction;
- scanlineDirty = true;
- }
- }
- }
-
- if (scanlineDirty)
- {
- if (!options.Antialias)
- {
- bool hasOnes = false;
- bool hasZeros = false;
- for (int x = 0; x < scanlineWidth; x++)
- {
- if (scanline[x] >= 0.5)
- {
- scanline[x] = 1;
- hasOnes = true;
- }
- else
- {
- scanline[x] = 0;
- hasZeros = true;
- }
- }
-
- if (isSolidBrushWithoutBlending && hasOnes != hasZeros)
- {
- if (hasOnes)
- {
- source.GetPixelRowSpan(y).Slice(minX, scanlineWidth).Fill(solidBrushColor);
- }
-
- continue;
- }
- }
-
- applicator.Apply(scanline, minX, y);
- }
- }
- }
- }
- }
-
- private bool IsSolidBrushWithoutBlending(out SolidBrush solidBrush)
- {
- solidBrush = this.definition.Brush as SolidBrush;
-
- if (solidBrush == null)
- {
- return false;
- }
-
- return this.definition.Options.IsOpaqueColorWithoutBlending(solidBrush.Color);
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/Processors/Text/DrawTextProcessor.cs b/src/ImageSharp.Drawing/Processing/Processors/Text/DrawTextProcessor.cs
deleted file mode 100644
index 75774a628..000000000
--- a/src/ImageSharp.Drawing/Processing/Processors/Text/DrawTextProcessor.cs
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-
-using SixLabors.Fonts;
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Processing.Processors.Text
-{
- ///
- /// Defines a processor to draw text on an .
- ///
- public class DrawTextProcessor : IImageProcessor
- {
- ///
- /// Initializes a new instance of the class.
- ///
- /// The options
- /// The text we want to render
- /// The font we want to render with
- /// The brush to source pixel colors from.
- /// The pen to outline text with.
- /// The location on the image to start drawing the text from.
- public DrawTextProcessor(TextGraphicsOptions options, string text, Font font, IBrush brush, IPen pen, PointF location)
- {
- Guard.NotNull(text, nameof(text));
- Guard.NotNull(font, nameof(font));
-
- if (brush is null && pen is null)
- {
- throw new ArgumentNullException($"Expected a {nameof(brush)} or {nameof(pen)}. Both were null");
- }
-
- this.Options = options;
- this.Text = text;
- this.Font = font;
- this.Location = location;
- this.Brush = brush;
- this.Pen = pen;
- }
-
- ///
- /// Gets the brush used to fill the glyphs.
- ///
- public IBrush Brush { get; }
-
- ///
- /// Gets the defining blending modes and text-specific drawing settings.
- ///
- public TextGraphicsOptions Options { get; }
-
- ///
- /// Gets the text to draw.
- ///
- public string Text { get; }
-
- ///
- /// Gets the pen used for outlining the text, if Null then we will not outline
- ///
- public IPen Pen { get; }
-
- ///
- /// Gets the font used to render the text.
- ///
- public Font Font { get; }
-
- ///
- /// Gets the location to draw the text at.
- ///
- public PointF Location { get; }
-
- ///
- public IImageProcessor CreatePixelSpecificProcessor(Configuration configuration, Image source, Rectangle sourceRectangle)
- where TPixel : struct, IPixel
- => new DrawTextProcessor(configuration, this, source, sourceRectangle);
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/Processors/Text/DrawTextProcessor{TPixel}.cs b/src/ImageSharp.Drawing/Processing/Processors/Text/DrawTextProcessor{TPixel}.cs
deleted file mode 100644
index c47f764a2..000000000
--- a/src/ImageSharp.Drawing/Processing/Processors/Text/DrawTextProcessor{TPixel}.cs
+++ /dev/null
@@ -1,453 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-using System.Buffers;
-using System.Collections.Generic;
-
-using SixLabors.Fonts;
-using SixLabors.ImageSharp.Advanced;
-using SixLabors.ImageSharp.Memory;
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.ImageSharp.Utils;
-using SixLabors.Memory;
-using SixLabors.Primitives;
-using SixLabors.Shapes;
-
-namespace SixLabors.ImageSharp.Processing.Processors.Text
-{
- ///
- /// Using the brush as a source of pixels colors blends the brush color with source.
- ///
- /// The pixel format.
- internal class DrawTextProcessor : ImageProcessor
- where TPixel : struct, IPixel
- {
- private CachingGlyphRenderer textRenderer;
-
- private readonly DrawTextProcessor definition;
-
- public DrawTextProcessor(Configuration configuration, DrawTextProcessor definition, Image source, Rectangle sourceRectangle)
- : base(configuration, source, sourceRectangle)
- {
- this.definition = definition;
- }
-
- private TextGraphicsOptions Options => this.definition.Options;
-
- private Font Font => this.definition.Font;
-
- private PointF Location => this.definition.Location;
-
- private string Text => this.definition.Text;
-
- private IPen Pen => this.definition.Pen;
-
- private IBrush Brush => this.definition.Brush;
-
- protected override void BeforeImageApply()
- {
- base.BeforeImageApply();
-
- // do everything at the image level as we are delegating the processing down to other processors
- var style = new RendererOptions(this.Font, this.Options.DpiX, this.Options.DpiY, this.Location)
- {
- ApplyKerning = this.Options.ApplyKerning,
- TabWidth = this.Options.TabWidth,
- WrappingWidth = this.Options.WrapTextWidth,
- HorizontalAlignment = this.Options.HorizontalAlignment,
- VerticalAlignment = this.Options.VerticalAlignment
- };
-
- this.textRenderer = new CachingGlyphRenderer(this.Configuration.MemoryAllocator, this.Text.Length, this.Pen, this.Brush != null);
- this.textRenderer.Options = (GraphicsOptions)this.Options;
- var renderer = new TextRenderer(this.textRenderer);
- renderer.RenderText(this.Text, style);
- }
-
- protected override void AfterImageApply()
- {
- base.AfterImageApply();
- this.textRenderer?.Dispose();
- this.textRenderer = null;
- }
-
- ///
- protected override void OnFrameApply(ImageFrame source)
- {
- // this is a no-op as we have processes all as an image, we should be able to pass out of before email apply a skip frames outcome
- Draw(this.textRenderer.FillOperations, this.Brush);
- Draw(this.textRenderer.OutlineOperations, this.Pen?.StrokeFill);
-
- void Draw(List operations, IBrush brush)
- {
- if (operations?.Count > 0)
- {
- using (BrushApplicator app = brush.CreateApplicator(this.Configuration, this.textRenderer.Options, source, this.SourceRectangle))
- {
- foreach (DrawingOperation operation in operations)
- {
- Buffer2D buffer = operation.Map;
- int startY = operation.Location.Y;
- int startX = operation.Location.X;
- int offsetSpan = 0;
- if (startX < 0)
- {
- offsetSpan = -startX;
- startX = 0;
- }
-
- if (startX >= source.Width)
- {
- continue;
- }
-
- int firstRow = 0;
- if (startY < 0)
- {
- firstRow = -startY;
- }
-
- int maxHeight = source.Height - startY;
- int end = Math.Min(operation.Map.Height, maxHeight);
-
- for (int row = firstRow; row < end; row++)
- {
- int y = startY + row;
- Span span = buffer.GetRowSpan(row).Slice(offsetSpan);
- app.Apply(span, startX, y);
- }
- }
- }
- }
- }
- }
-
- private struct DrawingOperation
- {
- public Buffer2D Map { get; set; }
-
- public Point Location { get; set; }
- }
-
- private class CachingGlyphRenderer : IGlyphRenderer, IDisposable
- {
- // just enough accuracy to allow for 1/8 pixel differences which
- // later are accumulated while rendering, but do not grow into full pixel offsets
- // The value 8 is benchmarked to:
- // - Provide a good accuracy (smaller than 0.2% image difference compared to the non-caching variant)
- // - Cache hit ratio above 60%
- private const float AccuracyMultiple = 8;
-
- private readonly PathBuilder builder;
-
- private Point currentRenderPosition;
- private (GlyphRendererParameters glyph, PointF subPixelOffset) currentGlyphRenderParams;
- private readonly int offset;
- private PointF currentPoint;
-
- private readonly Dictionary<(GlyphRendererParameters glyph, PointF subPixelOffset), GlyphRenderData>
- glyphData = new Dictionary<(GlyphRendererParameters glyph, PointF subPixelOffset), GlyphRenderData>();
-
- private readonly bool renderOutline;
- private readonly bool renderFill;
- private bool rasterizationRequired;
-
- public CachingGlyphRenderer(MemoryAllocator memoryAllocator, int size, IPen pen, bool renderFill)
- {
- this.MemoryAllocator = memoryAllocator;
- this.currentRenderPosition = default;
- this.Pen = pen;
- this.renderFill = renderFill;
- this.renderOutline = pen != null;
- this.offset = 2;
- if (this.renderFill)
- {
- this.FillOperations = new List(size);
- }
-
- if (this.renderOutline)
- {
- this.offset = (int)MathF.Ceiling((pen.StrokeWidth * 2) + 2);
- this.OutlineOperations = new List(size);
- }
-
- this.builder = new PathBuilder();
- }
-
- public List FillOperations { get; }
-
- public List OutlineOperations { get; }
-
- public MemoryAllocator MemoryAllocator { get; internal set; }
-
- public IPen Pen { get; internal set; }
-
- public GraphicsOptions Options { get; internal set; }
-
- public void BeginFigure()
- {
- this.builder.StartFigure();
- }
-
- public bool BeginGlyph(RectangleF bounds, GlyphRendererParameters parameters)
- {
- this.currentRenderPosition = Point.Truncate(bounds.Location);
- PointF subPixelOffset = bounds.Location - this.currentRenderPosition;
-
- subPixelOffset.X = MathF.Round(subPixelOffset.X * AccuracyMultiple) / AccuracyMultiple;
- subPixelOffset.Y = MathF.Round(subPixelOffset.Y * AccuracyMultiple) / AccuracyMultiple;
-
- // we have offset our rendering origin a little bit down to prevent edge cropping, move the draw origin up to compensate
- this.currentRenderPosition = new Point(this.currentRenderPosition.X - this.offset, this.currentRenderPosition.Y - this.offset);
- this.currentGlyphRenderParams = (parameters, subPixelOffset);
-
- if (this.glyphData.ContainsKey(this.currentGlyphRenderParams))
- {
- // we have already drawn the glyph vectors skip trying again
- this.rasterizationRequired = false;
- return false;
- }
-
- // we check to see if we have a render cache and if we do then we render else
- this.builder.Clear();
-
- // ensure all glyphs render around [zero, zero] so offset negative root positions so when we draw the glyph we can offset it back
- this.builder.SetOrigin(new PointF(-(int)bounds.X + this.offset, -(int)bounds.Y + this.offset));
-
- this.rasterizationRequired = true;
- return true;
- }
-
- public void BeginText(RectangleF bounds)
- {
- // not concerned about this one
- this.OutlineOperations?.Clear();
- this.FillOperations?.Clear();
- }
-
- public void CubicBezierTo(PointF secondControlPoint, PointF thirdControlPoint, PointF point)
- {
- this.builder.AddBezier(this.currentPoint, secondControlPoint, thirdControlPoint, point);
- this.currentPoint = point;
- }
-
- public void Dispose()
- {
- foreach (KeyValuePair<(GlyphRendererParameters glyph, PointF subPixelOffset), GlyphRenderData> kv in this.glyphData)
- {
- kv.Value.Dispose();
- }
-
- this.glyphData.Clear();
- }
-
- public void EndFigure()
- {
- this.builder.CloseFigure();
- }
-
- public void EndGlyph()
- {
- GlyphRenderData renderData = default;
-
- // has the glyph been rendered already?
- if (this.rasterizationRequired)
- {
- IPath path = this.builder.Build();
-
- if (this.renderFill)
- {
- renderData.FillMap = this.Render(path);
- }
-
- if (this.renderOutline)
- {
- if (this.Pen.StrokePattern.Length == 0)
- {
- path = path.GenerateOutline(this.Pen.StrokeWidth);
- }
- else
- {
- path = path.GenerateOutline(this.Pen.StrokeWidth, this.Pen.StrokePattern);
- }
-
- renderData.OutlineMap = this.Render(path);
- }
-
- this.glyphData[this.currentGlyphRenderParams] = renderData;
- }
- else
- {
- renderData = this.glyphData[this.currentGlyphRenderParams];
- }
-
- if (this.renderFill)
- {
- this.FillOperations.Add(new DrawingOperation
- {
- Location = this.currentRenderPosition,
- Map = renderData.FillMap
- });
- }
-
- if (this.renderOutline)
- {
- this.OutlineOperations.Add(new DrawingOperation
- {
- Location = this.currentRenderPosition,
- Map = renderData.OutlineMap
- });
- }
- }
-
- private Buffer2D Render(IPath path)
- {
- Size size = Rectangle.Ceiling(path.Bounds).Size;
- size = new Size(size.Width + (this.offset * 2), size.Height + (this.offset * 2));
-
- float subpixelCount = 4;
- float offset = 0.5f;
- if (this.Options.Antialias)
- {
- offset = 0f; // we are antialiasing skip offsetting as real antialiasing should take care of offset.
- subpixelCount = this.Options.AntialiasSubpixelDepth;
- if (subpixelCount < 4)
- {
- subpixelCount = 4;
- }
- }
-
- // take the path inside the path builder, scan thing and generate a Buffer2d representing the glyph and cache it.
- Buffer2D fullBuffer = this.MemoryAllocator.Allocate2D(size.Width + 1, size.Height + 1, AllocationOptions.Clean);
-
- using (IMemoryOwner bufferBacking = this.MemoryAllocator.Allocate(path.MaxIntersections))
- using (IMemoryOwner rowIntersectionBuffer = this.MemoryAllocator.Allocate(size.Width))
- {
- float subpixelFraction = 1f / subpixelCount;
- float subpixelFractionPoint = subpixelFraction / subpixelCount;
- Span intersectionSpan = rowIntersectionBuffer.Memory.Span;
- Span buffer = bufferBacking.Memory.Span;
-
- for (int y = 0; y <= size.Height; y++)
- {
- Span scanline = fullBuffer.GetRowSpan(y);
- bool scanlineDirty = false;
- float yPlusOne = y + 1;
-
- for (float subPixel = y; subPixel < yPlusOne; subPixel += subpixelFraction)
- {
- var start = new PointF(path.Bounds.Left - 1, subPixel);
- var end = new PointF(path.Bounds.Right + 1, subPixel);
- int pointsFound = path.FindIntersections(start, end, intersectionSpan);
-
- if (pointsFound == 0)
- {
- // nothing on this line skip
- continue;
- }
-
- for (int i = 0; i < pointsFound && i < intersectionSpan.Length; i++)
- {
- buffer[i] = intersectionSpan[i].X;
- }
-
- QuickSort.Sort(buffer.Slice(0, pointsFound));
-
- for (int point = 0; point < pointsFound; point += 2)
- {
- // points will be paired up
- float scanStart = buffer[point];
- float scanEnd = buffer[point + 1];
- int startX = (int)MathF.Floor(scanStart + offset);
- int endX = (int)MathF.Floor(scanEnd + offset);
-
- if (startX >= 0 && startX < scanline.Length)
- {
- for (float x = scanStart; x < startX + 1; x += subpixelFraction)
- {
- scanline[startX] += subpixelFractionPoint;
- scanlineDirty = true;
- }
- }
-
- if (endX >= 0 && endX < scanline.Length)
- {
- for (float x = endX; x < scanEnd; x += subpixelFraction)
- {
- scanline[endX] += subpixelFractionPoint;
- scanlineDirty = true;
- }
- }
-
- int nextX = startX + 1;
- endX = Math.Min(endX, scanline.Length); // reduce to end to the right edge
- nextX = Math.Max(nextX, 0);
- for (int x = nextX; x < endX; x++)
- {
- scanline[x] += subpixelFraction;
- scanlineDirty = true;
- }
- }
- }
-
- if (scanlineDirty)
- {
- if (!this.Options.Antialias)
- {
- for (int x = 0; x < size.Width; x++)
- {
- if (scanline[x] >= 0.5)
- {
- scanline[x] = 1;
- }
- else
- {
- scanline[x] = 0;
- }
- }
- }
- }
- }
- }
-
- return fullBuffer;
- }
-
- public void EndText()
- {
- }
-
- public void LineTo(PointF point)
- {
- this.builder.AddLine(this.currentPoint, point);
- this.currentPoint = point;
- }
-
- public void MoveTo(PointF point)
- {
- this.builder.StartFigure();
- this.currentPoint = point;
- }
-
- public void QuadraticBezierTo(PointF secondControlPoint, PointF point)
- {
- this.builder.AddBezier(this.currentPoint, secondControlPoint, point);
- this.currentPoint = point;
- }
-
- private struct GlyphRenderData : IDisposable
- {
- public Buffer2D FillMap;
-
- public Buffer2D OutlineMap;
-
- public void Dispose()
- {
- this.FillMap?.Dispose();
- this.OutlineMap?.Dispose();
- }
- }
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/RadialGradientBrush.cs b/src/ImageSharp.Drawing/Processing/RadialGradientBrush.cs
deleted file mode 100644
index 2b1b6913f..000000000
--- a/src/ImageSharp.Drawing/Processing/RadialGradientBrush.cs
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// A radial gradient brush, defined by center point and radius.
- ///
- public sealed class RadialGradientBrush : GradientBrush
- {
- private readonly PointF center;
-
- private readonly float radius;
-
- ///
- /// The center of the circular gradient and 0 for the color stops.
- /// The radius of the circular gradient and 1 for the color stops.
- /// Defines how the colors in the gradient are repeated.
- /// the color stops as defined in base class.
- public RadialGradientBrush(
- PointF center,
- float radius,
- GradientRepetitionMode repetitionMode,
- params ColorStop[] colorStops)
- : base(repetitionMode, colorStops)
- {
- this.center = center;
- this.radius = radius;
- }
-
- ///
- public override BrushApplicator CreateApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame source,
- RectangleF region) =>
- new RadialGradientBrushApplicator(
- configuration,
- options,
- source,
- this.center,
- this.radius,
- this.ColorStops,
- this.RepetitionMode);
-
- ///
- private sealed class RadialGradientBrushApplicator : GradientBrushApplicator
- where TPixel : struct, IPixel
- {
- private readonly PointF center;
-
- private readonly float radius;
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The configuration instance to use when performing operations.
- /// The graphics options.
- /// The target image.
- /// Center point of the gradient.
- /// Radius of the gradient.
- /// Definition of colors.
- /// How the colors are repeated beyond the first gradient.
- public RadialGradientBrushApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame target,
- PointF center,
- float radius,
- ColorStop[] colorStops,
- GradientRepetitionMode repetitionMode)
- : base(configuration, options, target, colorStops, repetitionMode)
- {
- this.center = center;
- this.radius = radius;
- }
-
- ///
- /// As this is a circular gradient, the position on the gradient is based on
- /// the distance of the point to the center.
- ///
- /// The X coordinate of the target pixel.
- /// The Y coordinate of the target pixel.
- /// the position on the color gradient.
- protected override float PositionOnGradient(float x, float y)
- {
- // TODO: Can this not use Vector2 distance?
- float distance = MathF.Sqrt(MathF.Pow(this.center.X - x, 2) + MathF.Pow(this.center.Y - y, 2));
- return distance / this.radius;
- }
-
- internal override void Apply(Span scanline, int x, int y)
- {
- // TODO: each row is symmetric across center, so we can calculate half of it and mirror it to improve performance.
- base.Apply(scanline, x, y);
- }
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/RecolorBrush.cs b/src/ImageSharp.Drawing/Processing/RecolorBrush.cs
deleted file mode 100644
index e0e43cf78..000000000
--- a/src/ImageSharp.Drawing/Processing/RecolorBrush.cs
+++ /dev/null
@@ -1,166 +0,0 @@
-// 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.PixelFormats;
-using SixLabors.Memory;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Provides an implementation of a brush that can recolor an image
- ///
- public class RecolorBrush : IBrush
- {
- ///
- /// Initializes a new instance of the class.
- ///
- /// Color of the source.
- /// Color of the target.
- /// The threshold as a value between 0 and 1.
- public RecolorBrush(Color sourceColor, Color targetColor, float threshold)
- {
- this.SourceColor = sourceColor;
- this.Threshold = threshold;
- this.TargetColor = targetColor;
- }
-
- ///
- /// Gets the threshold.
- ///
- public float Threshold { get; }
-
- ///
- /// Gets the source color.
- ///
- public Color SourceColor { get; }
-
- ///
- /// Gets the target color.
- ///
- public Color TargetColor { get; }
-
- ///
- public BrushApplicator CreateApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame source,
- RectangleF region)
- where TPixel : struct, IPixel
- {
- return new RecolorBrushApplicator(
- configuration,
- options,
- source,
- this.SourceColor.ToPixel(),
- this.TargetColor.ToPixel(),
- this.Threshold);
- }
-
- ///
- /// The recolor brush applicator.
- ///
- private class RecolorBrushApplicator : BrushApplicator
- where TPixel : struct, IPixel
- {
- ///
- /// The source color.
- ///
- private readonly Vector4 sourceColor;
-
- ///
- /// The threshold.
- ///
- private readonly float threshold;
-
- private readonly TPixel targetColorPixel;
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The configuration instance to use when performing operations.
- /// The options
- /// The source image.
- /// Color of the source.
- /// Color of the target.
- /// The threshold .
- public RecolorBrushApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame source,
- TPixel sourceColor,
- TPixel targetColor,
- float threshold)
- : base(configuration, options, source)
- {
- this.sourceColor = sourceColor.ToVector4();
- this.targetColorPixel = targetColor;
-
- // Lets hack a min max extremes for a color space by letting the IPackedPixel clamp our values to something in the correct spaces :)
- var maxColor = default(TPixel);
- maxColor.FromVector4(new Vector4(float.MaxValue));
- var minColor = default(TPixel);
- minColor.FromVector4(new Vector4(float.MinValue));
- this.threshold = Vector4.DistanceSquared(maxColor.ToVector4(), minColor.ToVector4()) * threshold;
- }
-
- ///
- internal override TPixel this[int x, int y]
- {
- get
- {
- // Offset the requested pixel by the value in the rectangle (the shapes position)
- TPixel result = this.Target[x, y];
- var background = result.ToVector4();
- float distance = Vector4.DistanceSquared(background, this.sourceColor);
- if (distance <= this.threshold)
- {
- float lerpAmount = (this.threshold - distance) / this.threshold;
- return this.Blender.Blend(
- result,
- this.targetColorPixel,
- lerpAmount);
- }
-
- return result;
- }
- }
-
- ///
- internal override void Apply(Span scanline, int x, int y)
- {
- MemoryAllocator memoryAllocator = this.Target.MemoryAllocator;
-
- using (IMemoryOwner amountBuffer = memoryAllocator.Allocate(scanline.Length))
- using (IMemoryOwner overlay = memoryAllocator.Allocate(scanline.Length))
- {
- Span amountSpan = amountBuffer.Memory.Span;
- Span overlaySpan = overlay.Memory.Span;
-
- for (int i = 0; i < scanline.Length; i++)
- {
- amountSpan[i] = scanline[i] * this.Options.BlendPercentage;
-
- int offsetX = x + i;
-
- // No doubt this one can be optimized further but I can't imagine its
- // actually being used and can probably be removed/internalized for now
- overlaySpan[i] = this[offsetX, y];
- }
-
- Span destinationRow = this.Target.GetPixelRowSpan(y).Slice(x, scanline.Length);
- this.Blender.Blend(
- this.Configuration,
- destinationRow,
- destinationRow,
- overlaySpan,
- amountSpan);
- }
- }
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/SolidBrush.cs b/src/ImageSharp.Drawing/Processing/SolidBrush.cs
deleted file mode 100644
index c297ede21..000000000
--- a/src/ImageSharp.Drawing/Processing/SolidBrush.cs
+++ /dev/null
@@ -1,139 +0,0 @@
-// 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.PixelFormats;
-using SixLabors.Memory;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Provides an implementation of a solid brush for painting solid color areas.
- ///
- public class SolidBrush : IBrush
- {
- ///
- /// Initializes a new instance of the class.
- ///
- /// The color.
- public SolidBrush(Color color)
- {
- this.Color = color;
- }
-
- ///
- /// Gets the color.
- ///
- public Color Color { get; }
-
- ///
- public BrushApplicator CreateApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame source,
- RectangleF region)
- where TPixel : struct, IPixel
- {
- return new SolidBrushApplicator(configuration, options, source, this.Color.ToPixel());
- }
-
- ///
- /// The solid brush applicator.
- ///
- private class SolidBrushApplicator : BrushApplicator
- where TPixel : struct, IPixel
- {
- private bool isDisposed;
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The configuration instance to use when performing operations.
- /// The graphics options.
- /// The source image.
- /// The color.
- public SolidBrushApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame source,
- TPixel color)
- : base(configuration, options, source)
- {
- this.Colors = source.MemoryAllocator.Allocate(source.Width);
- this.Colors.Memory.Span.Fill(color);
- }
-
- ///
- /// Gets the colors.
- ///
- protected IMemoryOwner Colors { get; private set; }
-
- ///
- internal override TPixel this[int x, int y] => this.Colors.Memory.Span[x];
-
- ///
- protected override void Dispose(bool disposing)
- {
- if (this.isDisposed)
- {
- return;
- }
-
- if (disposing)
- {
- this.Colors.Dispose();
- }
-
- this.Colors = null;
- this.isDisposed = true;
- }
-
- ///
- internal override void Apply(Span scanline, int x, int y)
- {
- Span destinationRow = this.Target.GetPixelRowSpan(y).Slice(x);
-
- // constrain the spans to each other
- if (destinationRow.Length > scanline.Length)
- {
- destinationRow = destinationRow.Slice(0, scanline.Length);
- }
- else
- {
- scanline = scanline.Slice(0, destinationRow.Length);
- }
-
- MemoryAllocator memoryAllocator = this.Target.MemoryAllocator;
- Configuration configuration = this.Configuration;
-
- if (this.Options.BlendPercentage == 1f)
- {
- this.Blender.Blend(configuration, destinationRow, destinationRow, this.Colors.Memory.Span, scanline);
- }
- else
- {
- using (IMemoryOwner amountBuffer = memoryAllocator.Allocate(scanline.Length))
- {
- Span amountSpan = amountBuffer.Memory.Span;
-
- for (int i = 0; i < scanline.Length; i++)
- {
- amountSpan[i] = scanline[i] * this.Options.BlendPercentage;
- }
-
- this.Blender.Blend(
- configuration,
- destinationRow,
- destinationRow,
- this.Colors.Memory.Span,
- amountSpan);
- }
- }
- }
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/TextGraphicsOptions.cs b/src/ImageSharp.Drawing/Processing/TextGraphicsOptions.cs
deleted file mode 100644
index 63730d1bf..000000000
--- a/src/ImageSharp.Drawing/Processing/TextGraphicsOptions.cs
+++ /dev/null
@@ -1,217 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.Fonts;
-using SixLabors.ImageSharp.PixelFormats;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Options for influencing the drawing functions.
- ///
- public class TextGraphicsOptions : IDeepCloneable
- {
- private int antialiasSubpixelDepth = 16;
- private float blendPercentage = 1F;
- private float tabWidth = 4F;
- private float dpiX = 72F;
- private float dpiY = 72F;
-
- ///
- /// Initializes a new instance of the class.
- ///
- public TextGraphicsOptions()
- {
- }
-
- private TextGraphicsOptions(TextGraphicsOptions source)
- {
- this.AlphaCompositionMode = source.AlphaCompositionMode;
- this.Antialias = source.Antialias;
- this.AntialiasSubpixelDepth = source.AntialiasSubpixelDepth;
- this.ApplyKerning = source.ApplyKerning;
- this.BlendPercentage = source.BlendPercentage;
- this.ColorBlendingMode = source.ColorBlendingMode;
- this.DpiX = source.DpiX;
- this.DpiY = source.DpiY;
- this.HorizontalAlignment = source.HorizontalAlignment;
- this.TabWidth = source.TabWidth;
- this.WrapTextWidth = source.WrapTextWidth;
- this.VerticalAlignment = source.VerticalAlignment;
- }
-
- ///
- /// Gets or sets a value indicating whether antialiasing should be applied.
- /// Defaults to true.
- ///
- public bool Antialias { get; set; } = true;
-
- ///
- /// Gets or sets a value indicating the number of subpixels to use while rendering with antialiasing enabled.
- ///
- public int AntialiasSubpixelDepth
- {
- get
- {
- return this.antialiasSubpixelDepth;
- }
-
- set
- {
- Guard.MustBeGreaterThanOrEqualTo(value, 0, nameof(this.AntialiasSubpixelDepth));
- this.antialiasSubpixelDepth = value;
- }
- }
-
- ///
- /// Gets or sets a value indicating the blending percentage to apply to the drawing operation.
- ///
- public float BlendPercentage
- {
- get
- {
- return this.blendPercentage;
- }
-
- set
- {
- Guard.MustBeBetweenOrEqualTo(value, 0, 1F, nameof(this.BlendPercentage));
- this.blendPercentage = value;
- }
- }
-
- ///
- /// Gets or sets a value indicating the color blending percentage to apply to the drawing operation.
- /// Defaults to .
- ///
- public PixelColorBlendingMode ColorBlendingMode { get; set; } = PixelColorBlendingMode.Normal;
-
- ///
- /// Gets or sets a value indicating the color blending percentage to apply to the drawing operation
- /// Defaults to .
- ///
- public PixelAlphaCompositionMode AlphaCompositionMode { get; set; } = PixelAlphaCompositionMode.SrcOver;
-
- ///
- /// Gets or sets a value indicating whether the text should be drawing with kerning enabled.
- /// Defaults to true;
- ///
- public bool ApplyKerning { get; set; } = true;
-
- ///
- /// Gets or sets a value indicating the number of space widths a tab should lock to.
- /// Defaults to 4.
- ///
- public float TabWidth
- {
- get
- {
- return this.tabWidth;
- }
-
- set
- {
- Guard.MustBeGreaterThanOrEqualTo(value, 0, nameof(this.TabWidth));
- this.tabWidth = value;
- }
- }
-
- ///
- /// Gets or sets a value, if greater than 0, indicating the width at which text should wrap.
- /// Defaults to 0.
- ///
- public float WrapTextWidth { get; set; }
-
- ///
- /// Gets or sets a value indicating the DPI (Dots Per Inch) to render text along the X axis.
- /// Defaults to 72.
- ///
- public float DpiX
- {
- get
- {
- return this.dpiX;
- }
-
- set
- {
- Guard.MustBeGreaterThanOrEqualTo(value, 0, nameof(this.DpiX));
- this.dpiX = value;
- }
- }
-
- ///
- /// Gets or sets a value indicating the DPI (Dots Per Inch) to render text along the Y axis.
- /// Defaults to 72.
- ///
- public float DpiY
- {
- get
- {
- return this.dpiY;
- }
-
- set
- {
- Guard.MustBeGreaterThanOrEqualTo(value, 0, nameof(this.DpiY));
- this.dpiY = value;
- }
- }
-
- ///
- /// Gets or sets a value indicating how to align the text relative to the rendering space.
- /// If is greater than zero it will align relative to the space
- /// defined by the location and width, if equals zero, and thus
- /// wrapping disabled, then the alignment is relative to the drawing location.
- /// Defaults to .
- ///
- public HorizontalAlignment HorizontalAlignment { get; set; } = HorizontalAlignment.Left;
-
- ///
- /// Gets or sets a value indicating how to align the text relative to the rendering space.
- /// Defaults to .
- ///
- public VerticalAlignment VerticalAlignment { get; set; } = VerticalAlignment.Top;
-
- ///
- /// Performs an implicit conversion from to .
- ///
- /// The options.
- ///
- /// The result of the conversion.
- ///
- public static implicit operator TextGraphicsOptions(GraphicsOptions options)
- {
- return new TextGraphicsOptions()
- {
- Antialias = options.Antialias,
- AntialiasSubpixelDepth = options.AntialiasSubpixelDepth,
- blendPercentage = options.BlendPercentage,
- ColorBlendingMode = options.ColorBlendingMode,
- AlphaCompositionMode = options.AlphaCompositionMode
- };
- }
-
- ///
- /// Performs an explicit conversion from to .
- ///
- /// The options.
- ///
- /// The result of the conversion.
- ///
- public static explicit operator GraphicsOptions(TextGraphicsOptions options)
- {
- return new GraphicsOptions()
- {
- Antialias = options.Antialias,
- AntialiasSubpixelDepth = options.AntialiasSubpixelDepth,
- ColorBlendingMode = options.ColorBlendingMode,
- AlphaCompositionMode = options.AlphaCompositionMode,
- BlendPercentage = options.BlendPercentage
- };
- }
-
- ///
- public TextGraphicsOptions DeepClone() => new TextGraphicsOptions(this);
- }
-}
diff --git a/src/ImageSharp.Drawing/Utils/NumberUtils.cs b/src/ImageSharp.Drawing/Utils/NumberUtils.cs
deleted file mode 100644
index d034c5d7e..000000000
--- a/src/ImageSharp.Drawing/Utils/NumberUtils.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System.Runtime.CompilerServices;
-
-namespace SixLabors.ImageSharp
-{
- ///
- /// Utility methods for numeric primitives.
- ///
- internal static class NumberUtils
- {
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public static float ClampFloat(float value, float min, float max)
- {
- if (value >= max)
- {
- return max;
- }
-
- if (value <= min)
- {
- return min;
- }
-
- return value;
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Utils/QuickSort.cs b/src/ImageSharp.Drawing/Utils/QuickSort.cs
deleted file mode 100644
index 14e3146a0..000000000
--- a/src/ImageSharp.Drawing/Utils/QuickSort.cs
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-using System.Runtime.CompilerServices;
-
-namespace SixLabors.ImageSharp.Utils
-{
- ///
- /// Optimized quick sort implementation for Span{float} input
- ///
- internal class QuickSort
- {
- ///
- /// Sorts the elements of in ascending order
- ///
- /// The items to sort
- public static void Sort(Span data)
- {
- if (data.Length < 2)
- {
- return;
- }
-
- if (data.Length == 2)
- {
- if (data[0] > data[1])
- {
- Swap(ref data[0], ref data[1]);
- }
-
- return;
- }
-
- Sort(ref data[0], 0, data.Length - 1);
- }
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- private static void Swap(ref float left, ref float right)
- {
- float tmp = left;
- left = right;
- right = tmp;
- }
-
- private static void Sort(ref float data0, int lo, int hi)
- {
- if (lo < hi)
- {
- int p = Partition(ref data0, lo, hi);
- Sort(ref data0, lo, p);
- Sort(ref data0, p + 1, hi);
- }
- }
-
- private static int Partition(ref float data0, int lo, int hi)
- {
- float pivot = Unsafe.Add(ref data0, lo);
- int i = lo - 1;
- int j = hi + 1;
- while (true)
- {
- do
- {
- i = i + 1;
- }
- while (Unsafe.Add(ref data0, i) < pivot && i < hi);
-
- do
- {
- j = j - 1;
- }
- while (Unsafe.Add(ref data0, j) > pivot && j > lo);
-
- if (i >= j)
- {
- return j;
- }
-
- Swap(ref Unsafe.Add(ref data0, i), ref Unsafe.Add(ref data0, j));
- }
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/Extensions/DrawImageExtensions.cs b/src/ImageSharp/Drawing/Processing/Extensions/DrawImageExtensions.cs
similarity index 100%
rename from src/ImageSharp.Drawing/Processing/Extensions/DrawImageExtensions.cs
rename to src/ImageSharp/Drawing/Processing/Extensions/DrawImageExtensions.cs
diff --git a/src/ImageSharp.Drawing/Processing/Processors/Drawing/DrawImageProcessor.cs b/src/ImageSharp/Drawing/Processing/Processors/Drawing/DrawImageProcessor.cs
similarity index 100%
rename from src/ImageSharp.Drawing/Processing/Processors/Drawing/DrawImageProcessor.cs
rename to src/ImageSharp/Drawing/Processing/Processors/Drawing/DrawImageProcessor.cs
diff --git a/src/ImageSharp.Drawing/Processing/Processors/Drawing/DrawImageProcessor{TPixelBg,TPixelFg}.cs b/src/ImageSharp/Drawing/Processing/Processors/Drawing/DrawImageProcessor{TPixelBg,TPixelFg}.cs
similarity index 100%
rename from src/ImageSharp.Drawing/Processing/Processors/Drawing/DrawImageProcessor{TPixelBg,TPixelFg}.cs
rename to src/ImageSharp/Drawing/Processing/Processors/Drawing/DrawImageProcessor{TPixelBg,TPixelFg}.cs
diff --git a/tests/ImageSharp.Benchmarks/Drawing/DrawBeziers.cs b/tests/ImageSharp.Benchmarks/Drawing/DrawBeziers.cs
deleted file mode 100644
index 8f4a7dfcb..000000000
--- a/tests/ImageSharp.Benchmarks/Drawing/DrawBeziers.cs
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System.Drawing;
-using System.Drawing.Drawing2D;
-using System.IO;
-using System.Numerics;
-using BenchmarkDotNet.Attributes;
-
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.ImageSharp.Processing;
-
-namespace SixLabors.ImageSharp.Benchmarks
-{
- public class DrawBeziers : BenchmarkBase
- {
- [Benchmark(Baseline = true, Description = "System.Drawing Draw Beziers")]
- public void DrawPathSystemDrawing()
- {
- using (var destination = new Bitmap(800, 800))
- using (var graphics = Graphics.FromImage(destination))
- {
- graphics.InterpolationMode = InterpolationMode.Default;
- graphics.SmoothingMode = SmoothingMode.AntiAlias;
-
- using (var pen = new System.Drawing.Pen(System.Drawing.Color.HotPink, 10))
- {
- graphics.DrawBeziers(pen, new[] {
- new PointF(10, 500),
- new PointF(30, 10),
- new PointF(240, 30),
- new PointF(300, 500)
- });
- }
-
- using (var stream = new MemoryStream())
- {
- destination.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
- }
- }
- }
-
- [Benchmark(Description = "ImageSharp Draw Beziers")]
- public void DrawLinesCore()
- {
- using (var image = new Image(800, 800))
- {
- image.Mutate(x => x.DrawBeziers(
- Rgba32.HotPink,
- 10,
- new Vector2(10, 500),
- new Vector2(30, 10),
- new Vector2(240, 30),
- new Vector2(300, 500)));
-
- using (var stream = new MemoryStream())
- {
- image.SaveAsBmp(stream);
- }
- }
- }
- }
-}
diff --git a/tests/ImageSharp.Benchmarks/Drawing/DrawLines.cs b/tests/ImageSharp.Benchmarks/Drawing/DrawLines.cs
deleted file mode 100644
index 43b7672c4..000000000
--- a/tests/ImageSharp.Benchmarks/Drawing/DrawLines.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System.Drawing;
-using System.Drawing.Drawing2D;
-using System.IO;
-using System.Numerics;
-
-using BenchmarkDotNet.Attributes;
-
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.ImageSharp.Processing;
-
-namespace SixLabors.ImageSharp.Benchmarks
-{
- public class DrawLines : BenchmarkBase
- {
- [Benchmark(Baseline = true, Description = "System.Drawing Draw Lines")]
- public void DrawPathSystemDrawing()
- {
- using (var destination = new Bitmap(800, 800))
- using (var graphics = Graphics.FromImage(destination))
- {
- graphics.InterpolationMode = InterpolationMode.Default;
- graphics.SmoothingMode = SmoothingMode.AntiAlias;
-
- using (var pen = new System.Drawing.Pen(System.Drawing.Color.HotPink, 10))
- {
- graphics.DrawLines(pen, new[] {
- new PointF(10, 10),
- new PointF(550, 50),
- new PointF(200, 400)
- });
- }
-
- using (var stream = new MemoryStream())
- {
- destination.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
- }
- }
- }
-
- [Benchmark(Description = "ImageSharp Draw Lines")]
- public void DrawLinesCore()
- {
- using (var image = new Image(800, 800))
- {
- image.Mutate(x => x.DrawLines(
- Rgba32.HotPink,
- 10,
- new Vector2(10, 10),
- new Vector2(550, 50),
- new Vector2(200, 400)));
-
- using (var stream = new MemoryStream())
- {
- image.SaveAsBmp(stream);
- }
- }
- }
- }
-}
diff --git a/tests/ImageSharp.Benchmarks/Drawing/DrawPolygon.cs b/tests/ImageSharp.Benchmarks/Drawing/DrawPolygon.cs
deleted file mode 100644
index f20469b63..000000000
--- a/tests/ImageSharp.Benchmarks/Drawing/DrawPolygon.cs
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System.Drawing;
-using System.Drawing.Drawing2D;
-using BenchmarkDotNet.Attributes;
-using System.IO;
-using System.Numerics;
-
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.ImageSharp.Processing;
-
-namespace SixLabors.ImageSharp.Benchmarks
-{
- public class DrawPolygon : BenchmarkBase
- {
- [Benchmark(Baseline = true, Description = "System.Drawing Draw Polygon")]
- public void DrawPolygonSystemDrawing()
- {
- using (var destination = new Bitmap(800, 800))
- using (var graphics = Graphics.FromImage(destination))
- {
- graphics.InterpolationMode = InterpolationMode.Default;
- graphics.SmoothingMode = SmoothingMode.AntiAlias;
- using (var pen = new System.Drawing.Pen(System.Drawing.Color.HotPink, 10))
- {
- graphics.DrawPolygon(pen, new[] {
- new PointF(10, 10),
- new PointF(550, 50),
- new PointF(200, 400)
- });
- }
-
- using (var stream = new MemoryStream())
- {
- destination.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
- }
- }
- }
-
- [Benchmark(Description = "ImageSharp Draw Polygon")]
- public void DrawPolygonCore()
- {
- using (var image = new Image(800, 800))
- {
- image.Mutate(x => x.DrawPolygon(
- Rgba32.HotPink,
- 10,
- new Vector2(10, 10),
- new Vector2(550, 50),
- new Vector2(200, 400)));
-
- using (var ms = new MemoryStream())
- {
- image.SaveAsBmp(ms);
- }
- }
- }
- }
-}
diff --git a/tests/ImageSharp.Benchmarks/Drawing/DrawText.cs b/tests/ImageSharp.Benchmarks/Drawing/DrawText.cs
deleted file mode 100644
index c19961390..000000000
--- a/tests/ImageSharp.Benchmarks/Drawing/DrawText.cs
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System.Drawing;
-using System.Drawing.Drawing2D;
-using BenchmarkDotNet.Attributes;
-
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.ImageSharp.Processing;
-using System.Linq;
-using SixLabors.ImageSharp.Processing.Processors.Text;
-
-namespace SixLabors.ImageSharp.Benchmarks
-{
- [MemoryDiagnoser]
- public class DrawText : BenchmarkBase
- {
- [Params(10, 100)]
- public int TextIterations { get; set; }
- public string TextPhrase { get; set; } = "Hello World";
- public string TextToRender => string.Join(" ", Enumerable.Repeat(this.TextPhrase, this.TextIterations));
-
-
- [Benchmark(Baseline = true, Description = "System.Drawing Draw Text")]
- public void DrawTextSystemDrawing()
- {
- using (var destination = new Bitmap(800, 800))
- using (var graphics = Graphics.FromImage(destination))
- {
- graphics.InterpolationMode = InterpolationMode.Default;
- graphics.SmoothingMode = SmoothingMode.AntiAlias;
- using (var font = new Font("Arial", 12, GraphicsUnit.Point))
- {
- graphics.DrawString(this.TextToRender, font, System.Drawing.Brushes.HotPink, new RectangleF(10, 10, 780, 780));
- }
- }
- }
-
- [Benchmark(Description = "ImageSharp Draw Text - Cached Glyphs")]
- public void DrawTextCore()
- {
- using (var image = new Image(800, 800))
- {
- var font = SixLabors.Fonts.SystemFonts.CreateFont("Arial", 12);
- image.Mutate(x => x.ApplyProcessor(new DrawTextProcessor(new TextGraphicsOptions { Antialias = true, WrapTextWidth = 780 }, this.TextToRender, font, Processing.Brushes.Solid(Rgba32.HotPink), null, new SixLabors.Primitives.PointF(10, 10))));
- }
- }
-
- [Benchmark(Description = "ImageSharp Draw Text - Nieve")]
- public void DrawTextCoreOld()
- {
- using (var image = new Image(800, 800))
- {
- var font = SixLabors.Fonts.SystemFonts.CreateFont("Arial", 12);
- image.Mutate(x => DrawTextOldVersion(x, new TextGraphicsOptions { Antialias = true, WrapTextWidth = 780 }, this.TextToRender, font, Processing.Brushes.Solid(Rgba32.HotPink), null, new SixLabors.Primitives.PointF(10, 10)));
- }
-
- IImageProcessingContext DrawTextOldVersion(
- IImageProcessingContext source,
- TextGraphicsOptions options,
- string text,
- SixLabors.Fonts.Font font,
- IBrush brush,
- IPen pen,
- SixLabors.Primitives.PointF location)
- {
- float dpiX = 72;
- float dpiY = 72;
-
- var style = new SixLabors.Fonts.RendererOptions(font, dpiX, dpiY, location)
- {
- ApplyKerning = options.ApplyKerning,
- TabWidth = options.TabWidth,
- WrappingWidth = options.WrapTextWidth,
- HorizontalAlignment = options.HorizontalAlignment,
- VerticalAlignment = options.VerticalAlignment
- };
-
- Shapes.IPathCollection glyphs = Shapes.TextBuilder.GenerateGlyphs(text, style);
-
- var pathOptions = (GraphicsOptions)options;
- if (brush != null)
- {
- source.Fill(pathOptions, brush, glyphs);
- }
-
- if (pen != null)
- {
- source.Draw(pathOptions, pen, glyphs);
- }
-
- return source;
- }
- }
- }
-}
diff --git a/tests/ImageSharp.Benchmarks/Drawing/DrawTextOutline.cs b/tests/ImageSharp.Benchmarks/Drawing/DrawTextOutline.cs
deleted file mode 100644
index 7d8b77659..000000000
--- a/tests/ImageSharp.Benchmarks/Drawing/DrawTextOutline.cs
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System.Drawing;
-using System.Drawing.Drawing2D;
-using BenchmarkDotNet.Attributes;
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.ImageSharp.Processing;
-using System.Linq;
-using SixLabors.ImageSharp.Processing.Processors.Text;
-
-namespace SixLabors.ImageSharp.Benchmarks
-{
- [MemoryDiagnoser]
- public class DrawTextOutline : BenchmarkBase
- {
- [Params(10, 100)]
- public int TextIterations { get; set; }
- public string TextPhrase { get; set; } = "Hello World";
- public string TextToRender => string.Join(" ", Enumerable.Repeat(this.TextPhrase, this.TextIterations));
-
- [Benchmark(Baseline = true, Description = "System.Drawing Draw Text Outline")]
- public void DrawTextSystemDrawing()
- {
- using (var destination = new Bitmap(800, 800))
- using (var graphics = Graphics.FromImage(destination))
- {
- graphics.InterpolationMode = InterpolationMode.Default;
- graphics.SmoothingMode = SmoothingMode.AntiAlias;
- using (var pen = new System.Drawing.Pen(System.Drawing.Color.HotPink, 10))
- using (var font = new Font("Arial", 12, GraphicsUnit.Point))
- using (var gp = new GraphicsPath())
- {
- gp.AddString(this.TextToRender, font.FontFamily, (int)font.Style, font.Size, new RectangleF(10, 10, 780, 780), new StringFormat());
- graphics.DrawPath(pen, gp);
- }
- }
- }
-
- [Benchmark(Description = "ImageSharp Draw Text Outline - Cached Glyphs")]
- public void DrawTextCore()
- {
- using (var image = new Image(800, 800))
- {
- var font = SixLabors.Fonts.SystemFonts.CreateFont("Arial", 12);
- image.Mutate(x => x.ApplyProcessor(new DrawTextProcessor(new TextGraphicsOptions { Antialias = true, WrapTextWidth = 780 }, this.TextToRender, font, null, Processing.Pens.Solid(Rgba32.HotPink, 10), new SixLabors.Primitives.PointF(10, 10))));
- }
- }
-
- [Benchmark(Description = "ImageSharp Draw Text Outline - Nieve")]
- public void DrawTextCoreOld()
- {
- using (var image = new Image(800, 800))
- {
- var font = SixLabors.Fonts.SystemFonts.CreateFont("Arial", 12);
- image.Mutate(
- x => DrawTextOldVersion(
- x,
- new TextGraphicsOptions { Antialias = true, WrapTextWidth = 780 },
- this.TextToRender,
- font,
- null,
- Processing.Pens.Solid(Rgba32.HotPink, 10),
- new SixLabors.Primitives.PointF(10, 10)));
- }
-
- IImageProcessingContext DrawTextOldVersion(
- IImageProcessingContext source,
- TextGraphicsOptions options,
- string text,
- SixLabors.Fonts.Font font,
- IBrush brush,
- IPen pen,
- SixLabors.Primitives.PointF location)
- {
- var style = new SixLabors.Fonts.RendererOptions(font, options.DpiX, options.DpiY, location)
- {
- ApplyKerning = options.ApplyKerning,
- TabWidth = options.TabWidth,
- WrappingWidth = options.WrapTextWidth,
- HorizontalAlignment = options.HorizontalAlignment,
- VerticalAlignment = options.VerticalAlignment
- };
-
- Shapes.IPathCollection glyphs = Shapes.TextBuilder.GenerateGlyphs(text, style);
-
- var pathOptions = (GraphicsOptions)options;
- if (brush != null)
- {
- source.Fill(pathOptions, brush, glyphs);
- }
-
- if (pen != null)
- {
- source.Draw(pathOptions, pen, glyphs);
- }
-
- return source;
- }
- }
- }
-}
diff --git a/tests/ImageSharp.Benchmarks/Drawing/FillPolygon.cs b/tests/ImageSharp.Benchmarks/Drawing/FillPolygon.cs
deleted file mode 100644
index f33df7ec6..000000000
--- a/tests/ImageSharp.Benchmarks/Drawing/FillPolygon.cs
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System.Drawing;
-using System.Drawing.Drawing2D;
-using System.IO;
-using System.Numerics;
-using SixLabors.Shapes;
-using BenchmarkDotNet.Attributes;
-
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.ImageSharp.Processing;
-
-namespace SixLabors.ImageSharp.Benchmarks
-{
- public class FillPolygon : BenchmarkBase
- {
- private readonly Polygon shape;
-
- public FillPolygon()
- {
- this.shape = new Polygon(new LinearLineSegment(
- new Vector2(10, 10),
- new Vector2(550, 50),
- new Vector2(200, 400)));
- }
-
- [Benchmark(Baseline = true, Description = "System.Drawing Fill Polygon")]
- public void DrawSolidPolygonSystemDrawing()
- {
- using (var destination = new Bitmap(800, 800))
-
- using (var graphics = Graphics.FromImage(destination))
- {
- graphics.SmoothingMode = SmoothingMode.AntiAlias;
- graphics.FillPolygon(System.Drawing.Brushes.HotPink,
- new[] {
- new Point(10, 10),
- new Point(550, 50),
- new Point(200, 400)
- });
-
- using (var stream = new MemoryStream())
- {
- destination.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
- }
- }
- }
-
- [Benchmark(Description = "ImageSharp Fill Polygon")]
- public void DrawSolidPolygonCore()
- {
- using (var image = new Image(800, 800))
- {
- image.Mutate(x => x.FillPolygon(
- Rgba32.HotPink,
- new Vector2(10, 10),
- new Vector2(550, 50),
- new Vector2(200, 400)));
-
- using (var stream = new MemoryStream())
- {
- image.SaveAsBmp(stream);
- }
- }
- }
-
- [Benchmark(Description = "ImageSharp Fill Polygon - cached shape")]
- public void DrawSolidPolygonCoreCached()
- {
- using (var image = new Image(800, 800))
- {
- image.Mutate(x => x.Fill(
- Rgba32.HotPink,
- this.shape));
-
- using (var stream = new MemoryStream())
- {
- image.SaveAsBmp(stream);
- }
- }
- }
- }
-}
diff --git a/tests/ImageSharp.Benchmarks/Drawing/FillRectangle.cs b/tests/ImageSharp.Benchmarks/Drawing/FillRectangle.cs
deleted file mode 100644
index 531c540da..000000000
--- a/tests/ImageSharp.Benchmarks/Drawing/FillRectangle.cs
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System.Drawing;
-using System.Drawing.Drawing2D;
-using System.Numerics;
-using BenchmarkDotNet.Attributes;
-
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.ImageSharp.Processing;
-using CoreRectangle = SixLabors.Primitives.Rectangle;
-using CoreSize = SixLabors.Primitives.Size;
-
-namespace SixLabors.ImageSharp.Benchmarks
-{
- public class FillRectangle : BenchmarkBase
- {
- [Benchmark(Baseline = true, Description = "System.Drawing Fill Rectangle")]
- public Size FillRectangleSystemDrawing()
- {
- using (var destination = new Bitmap(800, 800))
- using (var graphics = Graphics.FromImage(destination))
- {
- graphics.InterpolationMode = InterpolationMode.Default;
- graphics.SmoothingMode = SmoothingMode.AntiAlias;
- graphics.FillRectangle(System.Drawing.Brushes.HotPink, new Rectangle(10, 10, 190, 140));
-
- return destination.Size;
- }
- }
-
- [Benchmark(Description = "ImageSharp Fill Rectangle")]
- public CoreSize FillRectangleCore()
- {
- using (var image = new Image(800, 800))
- {
- image.Mutate(x => x.Fill(Rgba32.HotPink, new CoreRectangle(10, 10, 190, 140)));
-
- return new CoreSize(image.Width, image.Height);
- }
- }
-
- [Benchmark(Description = "ImageSharp Fill Rectangle - As Polygon")]
- public CoreSize FillPolygonCore()
- {
- using (var image = new Image(800, 800))
- {
- image.Mutate(x => x.FillPolygon(
- Rgba32.HotPink,
- new Vector2(10, 10),
- new Vector2(200, 10),
- new Vector2(200, 150),
- new Vector2(10, 150)));
-
- return new CoreSize(image.Width, image.Height);
- }
- }
- }
-}
diff --git a/tests/ImageSharp.Benchmarks/Drawing/FillWithPattern.cs b/tests/ImageSharp.Benchmarks/Drawing/FillWithPattern.cs
deleted file mode 100644
index 411f8210a..000000000
--- a/tests/ImageSharp.Benchmarks/Drawing/FillWithPattern.cs
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System.Drawing;
-using System.Drawing.Drawing2D;
-using System.IO;
-
-using BenchmarkDotNet.Attributes;
-
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.ImageSharp.Processing;
-
-using CoreBrushes = SixLabors.ImageSharp.Processing.Brushes;
-
-namespace SixLabors.ImageSharp.Benchmarks
-{
- public class FillWithPattern
- {
- [Benchmark(Baseline = true, Description = "System.Drawing Fill with Pattern")]
- public void DrawPatternPolygonSystemDrawing()
- {
- using (var destination = new Bitmap(800, 800))
- using (var graphics = Graphics.FromImage(destination))
- {
- graphics.SmoothingMode = SmoothingMode.AntiAlias;
-
- using (var brush = new HatchBrush(HatchStyle.BackwardDiagonal, System.Drawing.Color.HotPink))
- {
- graphics.FillRectangle(brush, new Rectangle(0, 0, 800, 800)); // can't find a way to flood fill with a brush
- }
-
- using (var stream = new MemoryStream())
- {
- destination.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
- }
- }
- }
-
- [Benchmark(Description = "ImageSharp Fill with Pattern")]
- public void DrawPatternPolygon3Core()
- {
- using (var image = new Image(800, 800))
- {
- image.Mutate(x => x.Fill(CoreBrushes.BackwardDiagonal(Rgba32.HotPink)));
-
- using (var stream = new MemoryStream())
- {
- image.SaveAsBmp(stream);
- }
- }
- }
- }
-}
\ No newline at end of file
diff --git a/tests/ImageSharp.Benchmarks/ImageSharp.Benchmarks.csproj b/tests/ImageSharp.Benchmarks/ImageSharp.Benchmarks.csproj
index cd8497ee4..a714d1f0d 100644
--- a/tests/ImageSharp.Benchmarks/ImageSharp.Benchmarks.csproj
+++ b/tests/ImageSharp.Benchmarks/ImageSharp.Benchmarks.csproj
@@ -26,7 +26,6 @@
-
diff --git a/tests/ImageSharp.Sandbox46/ImageSharp.Sandbox46.csproj b/tests/ImageSharp.Sandbox46/ImageSharp.Sandbox46.csproj
index fc94668e1..fc764b53b 100644
--- a/tests/ImageSharp.Sandbox46/ImageSharp.Sandbox46.csproj
+++ b/tests/ImageSharp.Sandbox46/ImageSharp.Sandbox46.csproj
@@ -22,7 +22,6 @@
-
diff --git a/tests/ImageSharp.Tests/Drawing/DrawBezierTests.cs b/tests/ImageSharp.Tests/Drawing/DrawBezierTests.cs
deleted file mode 100644
index de5b2bf47..000000000
--- a/tests/ImageSharp.Tests/Drawing/DrawBezierTests.cs
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-using System.Numerics;
-
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.ImageSharp.Processing;
-
-using Xunit;
-
-namespace SixLabors.ImageSharp.Tests.Drawing
-{
- [GroupOutput("Drawing")]
- public class DrawBezierTests
- {
- public static readonly TheoryData DrawPathData = new TheoryData
- {
- { "White", 255, 1.5f },
- { "Red", 255, 3 },
- { "HotPink", 255, 5 },
- { "HotPink", 150, 5 },
- { "White", 255, 15 },
- };
-
- [Theory]
- [WithSolidFilledImages(nameof(DrawPathData), 300, 450, "Blue", PixelTypes.Rgba32)]
- public void DrawBeziers(TestImageProvider