diff --git a/src/ImageSharp/GraphicOptionsDefaultsExtensions.cs b/src/ImageSharp/GraphicOptionsDefaultsExtensions.cs
index 38baf91d3..45e444ffe 100644
--- a/src/ImageSharp/GraphicOptionsDefaultsExtensions.cs
+++ b/src/ImageSharp/GraphicOptionsDefaultsExtensions.cs
@@ -11,6 +11,30 @@ namespace SixLabors.ImageSharp
///
public static class GraphicOptionsDefaultsExtensions
{
+ ///
+ /// Sets the default options against the image processing context.
+ ///
+ /// The image processing context to store default against.
+ /// The action to update instance of the default options used.
+ public static void SetDefaultOptions(this IImageProcessingContext context, Action optionsBuilder)
+ {
+ var cloned = context.GetDefaultGraphicsOptions().DeepClone();
+ optionsBuilder(cloned);
+ context.Properties[typeof(GraphicsOptions)] = cloned;
+ }
+
+ ///
+ /// Sets the default options against the configuration.
+ ///
+ /// The image processing context to store default against.
+ /// The default options to use.
+ public static void SetDefaultGraphicsOptions(this Configuration context, Action optionsBuilder)
+ {
+ var cloned = context.GetDefaultGraphicsOptions().DeepClone();
+ optionsBuilder(cloned);
+ context.Properties[typeof(GraphicsOptions)] = cloned;
+ }
+
///
/// Sets the default options against the image processing context.
///
@@ -26,7 +50,7 @@ namespace SixLabors.ImageSharp
///
/// The image processing context to store default against.
/// The default options to use.
- public static void SetDefaultOptions(this Configuration context, GraphicsOptions options)
+ public static void SetDefaultGraphicsOptions(this Configuration context, GraphicsOptions options)
{
context.Properties[typeof(GraphicsOptions)] = options;
}
diff --git a/tests/ImageSharp.Tests/GraphicOptionsDefaultsExtensionsTests.cs b/tests/ImageSharp.Tests/GraphicOptionsDefaultsExtensionsTests.cs
index 6707341d2..4b0d7a62d 100644
--- a/tests/ImageSharp.Tests/GraphicOptionsDefaultsExtensionsTests.cs
+++ b/tests/ImageSharp.Tests/GraphicOptionsDefaultsExtensionsTests.cs
@@ -3,6 +3,7 @@
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Tests.Processing;
+using SixLabors.ImageSharp.Tests.TestUtilities;
using Xunit;
namespace SixLabors.ImageSharp.Tests
@@ -23,17 +24,60 @@ namespace SixLabors.ImageSharp.Tests
Assert.DoesNotContain(typeof(GraphicsOptions), config.Properties.Keys);
}
+ [Fact]
+ public void UpdateDefaultOptionsOnProcessingContext_AlwaysNewInstance()
+ {
+ var option = new GraphicsOptions()
+ {
+ BlendPercentage = 0.9f
+ };
+ var config = new Configuration();
+ var context = new FakeImageOperationsProvider.FakeImageOperations(config, null, true);
+ context.SetDefaultOptions(option);
+
+ context.SetDefaultOptions(o =>
+ {
+ Assert.Equal(0.9f, o.BlendPercentage); // has origional values
+ o.BlendPercentage = 0.4f;
+ });
+
+ var returnedOption = context.GetDefaultGraphicsOptions();
+ Assert.Equal(0.4f, returnedOption.BlendPercentage);
+ Assert.Equal(0.9f, option.BlendPercentage); // hasn't been mutated
+ }
+
[Fact]
public void SetDefaultOptionsOnConfiguration()
{
var option = new GraphicsOptions();
var config = new Configuration();
- config.SetDefaultOptions(option);
+ config.SetDefaultGraphicsOptions(option);
Assert.Equal(option, config.Properties[typeof(GraphicsOptions)]);
}
+ [Fact]
+ public void UpdateDefaultOptionsOnConfiguration_AlwaysNewInstance()
+ {
+ var option = new GraphicsOptions()
+ {
+ BlendPercentage = 0.9f
+ };
+ var config = new Configuration();
+ config.SetDefaultGraphicsOptions(option);
+
+ config.SetDefaultGraphicsOptions(o =>
+ {
+ Assert.Equal(0.9f, o.BlendPercentage); // has origional values
+ o.BlendPercentage = 0.4f;
+ });
+
+ var returnedOption = config.GetDefaultGraphicsOptions();
+ Assert.Equal(0.4f, returnedOption.BlendPercentage);
+ Assert.Equal(0.9f, option.BlendPercentage); // hasn't been mutated
+ }
+
[Fact]
public void GetDefaultOptionsFromConfiguration_SettingNullThenReturnsNewInstance()
{
@@ -41,7 +85,7 @@ namespace SixLabors.ImageSharp.Tests
var options = config.GetDefaultGraphicsOptions();
Assert.NotNull(options);
- config.SetDefaultOptions((GraphicsOptions)null);
+ config.SetDefaultGraphicsOptions((GraphicsOptions)null);
var options2 = config.GetDefaultGraphicsOptions();
Assert.NotNull(options2);
@@ -107,7 +151,7 @@ namespace SixLabors.ImageSharp.Tests
{
var option = new GraphicsOptions();
var config = new Configuration();
- config.SetDefaultOptions(option);
+ config.SetDefaultGraphicsOptions(option);
var context = new FakeImageOperationsProvider.FakeImageOperations(config, null, true);
var ctxOptions = context.GetDefaultGraphicsOptions();