diff --git a/src/ImageSharp/Configuration.cs b/src/ImageSharp/Configuration.cs index 47c7c54ea0..b2d819f1c0 100644 --- a/src/ImageSharp/Configuration.cs +++ b/src/ImageSharp/Configuration.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Net.Http; using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.Formats.Bmp; using SixLabors.ImageSharp.Formats.Gif; @@ -27,6 +28,8 @@ namespace SixLabors.ImageSharp private int maxDegreeOfParallelism = Environment.ProcessorCount; + private Dictionary properties = new Dictionary(); + /// /// Initializes a new instance of the class. /// @@ -73,6 +76,12 @@ namespace SixLabors.ImageSharp } } + /// + /// Gets a set of properties for the Congiguration. + /// + /// This can be used for storing global settings and defaults to be accessable to processors. + public IDictionary Properties => this.properties; + /// /// Gets the currently registered s. /// diff --git a/src/ImageSharp/GraphicOptionsDefaultsExtensions.cs b/src/ImageSharp/GraphicOptionsDefaultsExtensions.cs new file mode 100644 index 0000000000..3d86a5b0c1 --- /dev/null +++ b/src/ImageSharp/GraphicOptionsDefaultsExtensions.cs @@ -0,0 +1,67 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.Processing; + +namespace SixLabors.ImageSharp +{ + /// + /// Adds extensions that allow the processing of images to the type. + /// + public static class GraphicOptionsDefaultsExtensions + { + /// + /// Sets the default options against the image processing context. + /// + /// The image processing context to store default against. + /// The default options to use. + public static void SetDefaultOptions(this IImageProcessingContext context, GraphicsOptions options) + { + context.Properties[typeof(GraphicsOptions)] = options; + } + + /// + /// Sets the default options against the configuration. + /// + /// The image processing context to store default against. + /// The default options to use. + public static void SetDefaultOptions(this Configuration context, GraphicsOptions options) + { + context.Properties[typeof(GraphicsOptions)] = options; + } + + /// + /// Gets the default options against the image processing context. + /// + /// The image processing context to retrieve defaults from. + /// The globaly configued default options. + public static GraphicsOptions GetDefaultGraphicsOptions(this IImageProcessingContext context) + { + if (context.Properties.TryGetValue(typeof(GraphicsOptions), out var options) && options is GraphicsOptions go) + { + return go; + } + + var configOptions = context.Configuration.GetDefaultGraphicsOptions(); + context.Properties[typeof(GraphicsOptions)] = configOptions; + return configOptions; + } + + /// + /// Gets the default options against the image processing context. + /// + /// The image processing context to retrieve defaults from. + /// The globaly configued default options. + public static GraphicsOptions GetDefaultGraphicsOptions(this Configuration context) + { + if (context.Properties.TryGetValue(typeof(GraphicsOptions), out var options) && options is GraphicsOptions go) + { + return go; + } + + var configOptions = new GraphicsOptions(); + context.Properties[typeof(GraphicsOptions)] = configOptions; + return configOptions; + } + } +} diff --git a/src/ImageSharp/Processing/DefaultImageProcessorContext{TPixel}.cs b/src/ImageSharp/Processing/DefaultImageProcessorContext{TPixel}.cs index 2e5919d1e3..5ee3f6483d 100644 --- a/src/ImageSharp/Processing/DefaultImageProcessorContext{TPixel}.cs +++ b/src/ImageSharp/Processing/DefaultImageProcessorContext{TPixel}.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. +using System.Collections.Generic; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing.Processors; @@ -15,6 +16,7 @@ namespace SixLabors.ImageSharp.Processing { private readonly bool mutate; private readonly Image source; + private readonly Dictionary properties = new Dictionary(); private Image destination; /// @@ -39,6 +41,9 @@ namespace SixLabors.ImageSharp.Processing /// public Configuration Configuration { get; } + /// + public IDictionary Properties => this.properties; + /// public Image GetResultImage() { diff --git a/src/ImageSharp/Processing/Extensions/Drawing/DrawImageExtensions.cs b/src/ImageSharp/Processing/Extensions/Drawing/DrawImageExtensions.cs index 4717c09eaf..197dcd3efa 100644 --- a/src/ImageSharp/Processing/Extensions/Drawing/DrawImageExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Drawing/DrawImageExtensions.cs @@ -23,7 +23,7 @@ namespace SixLabors.ImageSharp.Processing Image image, float opacity) { - var options = new GraphicsOptions(); + var options = source.GetDefaultGraphicsOptions(); return source.ApplyProcessor( new DrawImageProcessor( image, @@ -51,7 +51,7 @@ namespace SixLabors.ImageSharp.Processing image, Point.Empty, colorBlending, - new GraphicsOptions().AlphaCompositionMode, + source.GetDefaultGraphicsOptions().AlphaCompositionMode, opacity)); /// @@ -104,7 +104,7 @@ namespace SixLabors.ImageSharp.Processing Point location, float opacity) { - var options = new GraphicsOptions(); + var options = source.GetDefaultGraphicsOptions(); return source.ApplyProcessor( new DrawImageProcessor( image, @@ -134,7 +134,7 @@ namespace SixLabors.ImageSharp.Processing image, location, colorBlending, - new GraphicsOptions().AlphaCompositionMode, + source.GetDefaultGraphicsOptions().AlphaCompositionMode, opacity)); /// diff --git a/src/ImageSharp/Processing/Extensions/Filters/LomographExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/LomographExtensions.cs index 84b11c5e71..b46f53cf6a 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/LomographExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/LomographExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Filters; @@ -17,7 +17,7 @@ namespace SixLabors.ImageSharp.Processing /// The image this method extends. /// The to allow chaining of operations. public static IImageProcessingContext Lomograph(this IImageProcessingContext source) - => source.ApplyProcessor(new LomographProcessor()); + => source.ApplyProcessor(new LomographProcessor(source.GetDefaultGraphicsOptions())); /// /// Alters the colors of the image recreating an old Lomograph camera effect. @@ -28,6 +28,6 @@ namespace SixLabors.ImageSharp.Processing /// /// The to allow chaining of operations. public static IImageProcessingContext Lomograph(this IImageProcessingContext source, Rectangle rectangle) - => source.ApplyProcessor(new LomographProcessor(), rectangle); + => source.ApplyProcessor(new LomographProcessor(source.GetDefaultGraphicsOptions()), rectangle); } -} \ No newline at end of file +} diff --git a/src/ImageSharp/Processing/Extensions/Filters/PolaroidExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/PolaroidExtensions.cs index 94ced7108d..4e216b4f78 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/PolaroidExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/PolaroidExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Filters; @@ -17,7 +17,7 @@ namespace SixLabors.ImageSharp.Processing /// The image this method extends. /// The to allow chaining of operations. public static IImageProcessingContext Polaroid(this IImageProcessingContext source) - => source.ApplyProcessor(new PolaroidProcessor()); + => source.ApplyProcessor(new PolaroidProcessor(source.GetDefaultGraphicsOptions())); /// /// Alters the colors of the image recreating an old Polaroid camera effect. @@ -28,6 +28,6 @@ namespace SixLabors.ImageSharp.Processing /// /// The to allow chaining of operations. public static IImageProcessingContext Polaroid(this IImageProcessingContext source, Rectangle rectangle) - => source.ApplyProcessor(new PolaroidProcessor(), rectangle); + => source.ApplyProcessor(new PolaroidProcessor(source.GetDefaultGraphicsOptions()), rectangle); } } diff --git a/src/ImageSharp/Processing/Extensions/Overlays/BackgroundColorExtensions.cs b/src/ImageSharp/Processing/Extensions/Overlays/BackgroundColorExtensions.cs index d068ba10b5..ced37091ee 100644 --- a/src/ImageSharp/Processing/Extensions/Overlays/BackgroundColorExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Overlays/BackgroundColorExtensions.cs @@ -18,7 +18,7 @@ namespace SixLabors.ImageSharp.Processing /// The color to set as the background. /// The to allow chaining of operations. public static IImageProcessingContext BackgroundColor(this IImageProcessingContext source, Color color) => - BackgroundColor(source, new GraphicsOptions(), color); + BackgroundColor(source, source.GetDefaultGraphicsOptions(), color); /// /// Replaces the background color of image with the given one. @@ -33,7 +33,7 @@ namespace SixLabors.ImageSharp.Processing this IImageProcessingContext source, Color color, Rectangle rectangle) => - BackgroundColor(source, new GraphicsOptions(), color, rectangle); + BackgroundColor(source, source.GetDefaultGraphicsOptions(), color, rectangle); /// /// Replaces the background color of image with the given one. diff --git a/src/ImageSharp/Processing/Extensions/Overlays/GlowExtensions.cs b/src/ImageSharp/Processing/Extensions/Overlays/GlowExtensions.cs index d5114e30ab..63f0651193 100644 --- a/src/ImageSharp/Processing/Extensions/Overlays/GlowExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Overlays/GlowExtensions.cs @@ -17,7 +17,7 @@ namespace SixLabors.ImageSharp.Processing /// The image this method extends. /// The to allow chaining of operations. public static IImageProcessingContext Glow(this IImageProcessingContext source) => - Glow(source, new GraphicsOptions()); + Glow(source, source.GetDefaultGraphicsOptions()); /// /// Applies a radial glow effect to an image. @@ -27,7 +27,7 @@ namespace SixLabors.ImageSharp.Processing /// The to allow chaining of operations. public static IImageProcessingContext Glow(this IImageProcessingContext source, Color color) { - return Glow(source, new GraphicsOptions(), color); + return Glow(source, source.GetDefaultGraphicsOptions(), color); } /// @@ -37,7 +37,7 @@ namespace SixLabors.ImageSharp.Processing /// The the radius. /// The to allow chaining of operations. public static IImageProcessingContext Glow(this IImageProcessingContext source, float radius) => - Glow(source, new GraphicsOptions(), radius); + Glow(source, source.GetDefaultGraphicsOptions(), radius); /// /// Applies a radial glow effect to an image. @@ -48,7 +48,7 @@ namespace SixLabors.ImageSharp.Processing /// /// The to allow chaining of operations. public static IImageProcessingContext Glow(this IImageProcessingContext source, Rectangle rectangle) => - source.Glow(new GraphicsOptions(), rectangle); + source.Glow(source.GetDefaultGraphicsOptions(), rectangle); /// /// Applies a radial glow effect to an image. @@ -65,7 +65,7 @@ namespace SixLabors.ImageSharp.Processing Color color, float radius, Rectangle rectangle) => - source.Glow(new GraphicsOptions(), color, ValueSize.Absolute(radius), rectangle); + source.Glow(source.GetDefaultGraphicsOptions(), color, ValueSize.Absolute(radius), rectangle); /// /// Applies a radial glow effect to an image. diff --git a/src/ImageSharp/Processing/Extensions/Overlays/VignetteExtensions.cs b/src/ImageSharp/Processing/Extensions/Overlays/VignetteExtensions.cs index 799b30e01e..a3063832af 100644 --- a/src/ImageSharp/Processing/Extensions/Overlays/VignetteExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Overlays/VignetteExtensions.cs @@ -17,7 +17,7 @@ namespace SixLabors.ImageSharp.Processing /// The image this method extends. /// The to allow chaining of operations. public static IImageProcessingContext Vignette(this IImageProcessingContext source) => - Vignette(source, new GraphicsOptions()); + Vignette(source, source.GetDefaultGraphicsOptions()); /// /// Applies a radial vignette effect to an image. @@ -26,7 +26,7 @@ namespace SixLabors.ImageSharp.Processing /// The color to set as the vignette. /// The to allow chaining of operations. public static IImageProcessingContext Vignette(this IImageProcessingContext source, Color color) => - Vignette(source, new GraphicsOptions(), color); + Vignette(source, source.GetDefaultGraphicsOptions(), color); /// /// Applies a radial vignette effect to an image. @@ -39,7 +39,7 @@ namespace SixLabors.ImageSharp.Processing this IImageProcessingContext source, float radiusX, float radiusY) => - Vignette(source, new GraphicsOptions(), radiusX, radiusY); + Vignette(source, source.GetDefaultGraphicsOptions(), radiusX, radiusY); /// /// Applies a radial vignette effect to an image. @@ -50,7 +50,7 @@ namespace SixLabors.ImageSharp.Processing /// /// The to allow chaining of operations. public static IImageProcessingContext Vignette(this IImageProcessingContext source, Rectangle rectangle) => - Vignette(source, new GraphicsOptions(), rectangle); + Vignette(source, source.GetDefaultGraphicsOptions(), rectangle); /// /// Applies a radial vignette effect to an image. @@ -69,7 +69,7 @@ namespace SixLabors.ImageSharp.Processing float radiusX, float radiusY, Rectangle rectangle) => - source.Vignette(new GraphicsOptions(), color, radiusX, radiusY, rectangle); + source.Vignette(source.GetDefaultGraphicsOptions(), color, radiusX, radiusY, rectangle); /// /// Applies a radial vignette effect to an image. diff --git a/src/ImageSharp/Processing/IImageProcessingContext.cs b/src/ImageSharp/Processing/IImageProcessingContext.cs index 8b57a289d4..cb39766a94 100644 --- a/src/ImageSharp/Processing/IImageProcessingContext.cs +++ b/src/ImageSharp/Processing/IImageProcessingContext.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. +using System.Collections.Generic; using SixLabors.ImageSharp.Processing.Processors; namespace SixLabors.ImageSharp.Processing @@ -15,6 +16,12 @@ namespace SixLabors.ImageSharp.Processing /// Configuration Configuration { get; } + /// + /// Gets a set of properties for the Image Processing Context. + /// + /// This can be used for storing global settings and defaults to be accessable to processors. + IDictionary Properties { get; } + /// /// Gets the image dimensions at the current point in the processing pipeline. /// diff --git a/src/ImageSharp/Processing/Processors/Filters/LomographProcessor.cs b/src/ImageSharp/Processing/Processors/Filters/LomographProcessor.cs index 3c150d7ebf..bb6ea51c12 100644 --- a/src/ImageSharp/Processing/Processors/Filters/LomographProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Filters/LomographProcessor.cs @@ -11,11 +11,18 @@ namespace SixLabors.ImageSharp.Processing.Processors.Filters /// /// Initializes a new instance of the class. /// - public LomographProcessor() + /// Graphics options to use within the processor. + public LomographProcessor(GraphicsOptions graphicsOptions) : base(KnownFilterMatrices.LomographFilter) { + this.GraphicsOptions = graphicsOptions; } + /// + /// Gets the options effecting blending and composition + /// + public GraphicsOptions GraphicsOptions { get; } + /// public override IImageProcessor CreatePixelSpecificProcessor(Configuration configuration, Image source, Rectangle sourceRectangle) => new LomographProcessor(configuration, this, source, sourceRectangle); diff --git a/src/ImageSharp/Processing/Processors/Filters/LomographProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Filters/LomographProcessor{TPixel}.cs index 5a19b78516..0706e9fc8d 100644 --- a/src/ImageSharp/Processing/Processors/Filters/LomographProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Filters/LomographProcessor{TPixel}.cs @@ -13,6 +13,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Filters where TPixel : unmanaged, IPixel { private static readonly Color VeryDarkGreen = Color.FromRgba(0, 10, 0, 255); + private readonly LomographProcessor definition; /// /// Initializes a new instance of the class. @@ -24,12 +25,13 @@ namespace SixLabors.ImageSharp.Processing.Processors.Filters public LomographProcessor(Configuration configuration, LomographProcessor definition, Image source, Rectangle sourceRectangle) : base(configuration, definition, source, sourceRectangle) { + this.definition = definition; } /// protected override void AfterImageApply() { - new VignetteProcessor(VeryDarkGreen).Execute(this.Configuration, this.Source, this.SourceRectangle); + new VignetteProcessor(this.definition.GraphicsOptions, VeryDarkGreen).Execute(this.Configuration, this.Source, this.SourceRectangle); base.AfterImageApply(); } } diff --git a/src/ImageSharp/Processing/Processors/Filters/PolaroidProcessor.cs b/src/ImageSharp/Processing/Processors/Filters/PolaroidProcessor.cs index a5cf268625..965a35be15 100644 --- a/src/ImageSharp/Processing/Processors/Filters/PolaroidProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Filters/PolaroidProcessor.cs @@ -11,11 +11,18 @@ namespace SixLabors.ImageSharp.Processing.Processors.Filters /// /// Initializes a new instance of the class. /// - public PolaroidProcessor() + /// Graphics options to use within the processor. + public PolaroidProcessor(GraphicsOptions graphicsOptions) : base(KnownFilterMatrices.PolaroidFilter) { + this.GraphicsOptions = graphicsOptions; } + /// + /// Gets the options effecting blending and composition + /// + public GraphicsOptions GraphicsOptions { get; } + /// public override IImageProcessor CreatePixelSpecificProcessor(Configuration configuration, Image source, Rectangle sourceRectangle) => new PolaroidProcessor(configuration, this, source, sourceRectangle); diff --git a/src/ImageSharp/Processing/Processors/Filters/PolaroidProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Filters/PolaroidProcessor{TPixel}.cs index 9f547be1c9..470d553c2c 100644 --- a/src/ImageSharp/Processing/Processors/Filters/PolaroidProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Filters/PolaroidProcessor{TPixel}.cs @@ -14,6 +14,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Filters { private static readonly Color LightOrange = Color.FromRgba(255, 153, 102, 128); private static readonly Color VeryDarkOrange = Color.FromRgb(102, 34, 0); + private readonly PolaroidProcessor definition; /// /// Initializes a new instance of the class. @@ -25,13 +26,14 @@ namespace SixLabors.ImageSharp.Processing.Processors.Filters public PolaroidProcessor(Configuration configuration, PolaroidProcessor definition, Image source, Rectangle sourceRectangle) : base(configuration, definition, source, sourceRectangle) { + this.definition = definition; } /// protected override void AfterImageApply() { - new VignetteProcessor(VeryDarkOrange).Execute(this.Configuration, this.Source, this.SourceRectangle); - new GlowProcessor(LightOrange, this.Source.Width / 4F).Execute(this.Configuration, this.Source, this.SourceRectangle); + new VignetteProcessor(this.definition.GraphicsOptions, VeryDarkOrange).Execute(this.Configuration, this.Source, this.SourceRectangle); + new GlowProcessor(this.definition.GraphicsOptions, LightOrange, this.Source.Width / 4F).Execute(this.Configuration, this.Source, this.SourceRectangle); base.AfterImageApply(); } } diff --git a/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor.cs b/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor.cs index 87e93ca215..5e0d1cbf7e 100644 --- a/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor.cs @@ -10,15 +10,6 @@ namespace SixLabors.ImageSharp.Processing.Processors.Overlays /// public sealed class GlowProcessor : IImageProcessor { - /// - /// Initializes a new instance of the class. - /// - /// The color or the glow. - public GlowProcessor(Color color) - : this(color, 0) - { - } - /// /// Initializes a new instance of the class. /// @@ -29,16 +20,6 @@ namespace SixLabors.ImageSharp.Processing.Processors.Overlays { } - /// - /// Initializes a new instance of the class. - /// - /// The color or the glow. - /// The radius of the glow. - internal GlowProcessor(Color color, ValueSize radius) - : this(new GraphicsOptions(), color, radius) - { - } - /// /// Initializes a new instance of the class. /// diff --git a/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor.cs b/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor.cs index 5654eccfa4..3b16f8bc85 100644 --- a/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor.cs @@ -10,15 +10,6 @@ namespace SixLabors.ImageSharp.Processing.Processors.Overlays /// public sealed class VignetteProcessor : IImageProcessor { - /// - /// Initializes a new instance of the class. - /// - /// The color of the vignette. - public VignetteProcessor(Color color) - : this(new GraphicsOptions(), color) - { - } - /// /// Initializes a new instance of the class. /// diff --git a/tests/ImageSharp.Tests/Processing/FakeImageOperationsProvider.cs b/tests/ImageSharp.Tests/Processing/FakeImageOperationsProvider.cs index 3f11b46310..cd4d782792 100644 --- a/tests/ImageSharp.Tests/Processing/FakeImageOperationsProvider.cs +++ b/tests/ImageSharp.Tests/Processing/FakeImageOperationsProvider.cs @@ -56,6 +56,8 @@ namespace SixLabors.ImageSharp.Tests.Processing public Configuration Configuration { get; } + public IDictionary Properties { get; } = new Dictionary(); + public Image GetResultImage() { return this.Source;