diff --git a/src/ImageSharp/Configuration.cs b/src/ImageSharp/Configuration.cs
index 9a627eeb77..d53d9a9a59 100644
--- a/src/ImageSharp/Configuration.cs
+++ b/src/ImageSharp/Configuration.cs
@@ -24,28 +24,8 @@ namespace SixLabors.ImageSharp
///
/// A lazily initialized configuration default instance.
///
- private static readonly Lazy Lazy = new Lazy(CreateDefaultInstance);
-
- ///
- /// The list of supported keyed to mime types.
- ///
- private readonly ConcurrentDictionary mimeTypeEncoders = new ConcurrentDictionary();
-
- ///
- /// The list of supported keyed to mime types.
- ///
- private readonly ConcurrentDictionary mimeTypeDecoders = new ConcurrentDictionary();
-
- ///
- /// The list of supported s.
- ///
- private readonly ConcurrentBag imageFormats = new ConcurrentBag();
-
- ///
- /// The list of supported s.
- ///
- private ConcurrentBag imageFormatDetectors = new ConcurrentBag();
-
+ private static readonly Lazy Lazy = new Lazy(CreateDefaultInstance);
+
///
/// Initializes a new instance of the class.
///
@@ -81,7 +61,12 @@ namespace SixLabors.ImageSharp
///
/// Gets the currently registered s.
///
- public IEnumerable ImageFormats => this.imageFormats;
+ public IEnumerable ImageFormats => this.FormatsManager.ImageFormats;
+
+ ///
+ /// Gets or sets the that is currently in use.
+ ///
+ public ImageFormatsManager FormatsManager { get; set; } = new ImageFormatsManager();
///
/// Gets or sets the that is currently in use.
@@ -91,22 +76,22 @@ namespace SixLabors.ImageSharp
///
/// Gets the maximum header size of all the formats.
///
- internal int MaxHeaderSize { get; private set; }
-
+ internal int MaxHeaderSize => this.FormatsManager.MaxHeaderSize;
+
///
/// Gets the currently registered s.
///
- internal IEnumerable FormatDetectors => this.imageFormatDetectors;
+ internal IEnumerable FormatDetectors => this.FormatsManager.FormatDetectors;
///
/// Gets the currently registered s.
///
- internal IEnumerable> ImageDecoders => this.mimeTypeDecoders;
+ internal IEnumerable> ImageDecoders => this.FormatsManager.ImageDecoders;
///
/// Gets the currently registered s.
///
- internal IEnumerable> ImageEncoders => this.mimeTypeEncoders;
+ internal IEnumerable> ImageEncoders => this.FormatsManager.ImageEncoders;
#if !NETSTANDARD1_1
///
@@ -135,11 +120,8 @@ namespace SixLabors.ImageSharp
///
/// The format to register as a known format.
public void AddImageFormat(IImageFormat format)
- {
- Guard.NotNull(format, nameof(format));
- Guard.NotNull(format.MimeTypes, nameof(format.MimeTypes));
- Guard.NotNull(format.FileExtensions, nameof(format.FileExtensions));
- this.imageFormats.Add(format);
+ {
+ this.FormatsManager.AddImageFormat(format);
}
///
@@ -149,7 +131,7 @@ namespace SixLabors.ImageSharp
/// The if found otherwise null
public IImageFormat FindFormatByFileExtension(string extension)
{
- return this.imageFormats.FirstOrDefault(x => x.FileExtensions.Contains(extension, StringComparer.OrdinalIgnoreCase));
+ return this.FormatsManager.FindFormatByFileExtension(extension);
}
///
@@ -159,7 +141,7 @@ namespace SixLabors.ImageSharp
/// The if found; otherwise null
public IImageFormat FindFormatByMimeType(string mimeType)
{
- return this.imageFormats.FirstOrDefault(x => x.MimeTypes.Contains(mimeType, StringComparer.OrdinalIgnoreCase));
+ return this.FormatsManager.FindFormatByMimeType(mimeType);
}
///
@@ -169,10 +151,7 @@ namespace SixLabors.ImageSharp
/// The encoder to use,
public void SetEncoder(IImageFormat imageFormat, IImageEncoder encoder)
{
- Guard.NotNull(imageFormat, nameof(imageFormat));
- Guard.NotNull(encoder, nameof(encoder));
- this.AddImageFormat(imageFormat);
- this.mimeTypeEncoders.AddOrUpdate(imageFormat, encoder, (s, e) => encoder);
+ this.FormatsManager.SetEncoder(imageFormat, encoder);
}
///
@@ -182,10 +161,7 @@ namespace SixLabors.ImageSharp
/// The decoder to use,
public void SetDecoder(IImageFormat imageFormat, IImageDecoder decoder)
{
- Guard.NotNull(imageFormat, nameof(imageFormat));
- Guard.NotNull(decoder, nameof(decoder));
- this.AddImageFormat(imageFormat);
- this.mimeTypeDecoders.AddOrUpdate(imageFormat, decoder, (s, e) => decoder);
+ this.FormatsManager.SetDecoder(imageFormat, decoder);
}
///
@@ -193,7 +169,7 @@ namespace SixLabors.ImageSharp
///
public void ClearImageFormatDetectors()
{
- this.imageFormatDetectors = new ConcurrentBag();
+ this.FormatsManager.ClearImageFormatDetectors();
}
///
@@ -202,9 +178,7 @@ namespace SixLabors.ImageSharp
/// The detector to add
public void AddImageFormatDetector(IImageFormatDetector detector)
{
- Guard.NotNull(detector, nameof(detector));
- this.imageFormatDetectors.Add(detector);
- this.SetMaxHeaderSize();
+ this.FormatsManager.AddImageFormatDetector(detector);
}
///
@@ -214,13 +188,7 @@ namespace SixLabors.ImageSharp
/// The if found otherwise null
public IImageDecoder FindDecoder(IImageFormat format)
{
- Guard.NotNull(format, nameof(format));
- if (this.mimeTypeDecoders.TryGetValue(format, out IImageDecoder decoder))
- {
- return decoder;
- }
-
- return null;
+ return this.FormatsManager.FindDecoder(format);
}
///
@@ -230,13 +198,7 @@ namespace SixLabors.ImageSharp
/// The if found otherwise null
public IImageEncoder FindEncoder(IImageFormat format)
{
- Guard.NotNull(format, nameof(format));
- if (this.mimeTypeEncoders.TryGetValue(format, out IImageEncoder encoder))
- {
- return encoder;
- }
-
- return null;
+ return this.FormatsManager.FindEncoder(format);
}
///
@@ -254,14 +216,6 @@ namespace SixLabors.ImageSharp
new JpegConfigurationModule(),
new GifConfigurationModule(),
new BmpConfigurationModule());
- }
-
- ///
- /// Sets the max header size.
- ///
- private void SetMaxHeaderSize()
- {
- this.MaxHeaderSize = this.imageFormatDetectors.Max(x => x.HeaderSize);
- }
+ }
}
}
diff --git a/src/ImageSharp/Formats/ImageFormatsManager.cs b/src/ImageSharp/Formats/ImageFormatsManager.cs
new file mode 100644
index 0000000000..b9307e4a05
--- /dev/null
+++ b/src/ImageSharp/Formats/ImageFormatsManager.cs
@@ -0,0 +1,185 @@
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace SixLabors.ImageSharp.Formats
+{
+ ///
+ /// Collection of Image Formats to be used in class.
+ ///
+ public class ImageFormatsManager
+ {
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public ImageFormatsManager()
+ {
+ }
+
+ ///
+ /// The list of supported keyed to mime types.
+ ///
+ private readonly ConcurrentDictionary mimeTypeEncoders = new ConcurrentDictionary();
+
+ ///
+ /// The list of supported keyed to mime types.
+ ///
+ private readonly ConcurrentDictionary mimeTypeDecoders = new ConcurrentDictionary();
+
+ ///
+ /// The list of supported s.
+ ///
+ private readonly ConcurrentBag imageFormats = new ConcurrentBag();
+
+ ///
+ /// The list of supported s.
+ ///
+ private ConcurrentBag imageFormatDetectors = new ConcurrentBag();
+
+ ///
+ /// Gets the maximum header size of all the formats.
+ ///
+ internal int MaxHeaderSize { get; private set; }
+
+ ///
+ /// Gets the currently registered s.
+ ///
+ public IEnumerable ImageFormats => this.imageFormats;
+
+ ///
+ /// Gets the currently registered s.
+ ///
+ internal IEnumerable FormatDetectors => this.imageFormatDetectors;
+
+ ///
+ /// Gets the currently registered s.
+ ///
+ internal IEnumerable> ImageDecoders => this.mimeTypeDecoders;
+
+ ///
+ /// Gets the currently registered s.
+ ///
+ internal IEnumerable> ImageEncoders => this.mimeTypeEncoders;
+
+ ///
+ /// Registers a new format provider.
+ ///
+ /// The format to register as a known format.
+ public void AddImageFormat(IImageFormat format)
+ {
+ Guard.NotNull(format, nameof(format));
+ Guard.NotNull(format.MimeTypes, nameof(format.MimeTypes));
+ Guard.NotNull(format.FileExtensions, nameof(format.FileExtensions));
+ this.imageFormats.Add(format);
+ }
+
+ ///
+ /// For the specified file extensions type find the e .
+ ///
+ /// The extension to discover
+ /// The if found otherwise null
+ public IImageFormat FindFormatByFileExtension(string extension)
+ {
+ return this.imageFormats.FirstOrDefault(x => x.FileExtensions.Contains(extension, StringComparer.OrdinalIgnoreCase));
+ }
+
+ ///
+ /// For the specified mime type find the .
+ ///
+ /// The mime-type to discover
+ /// The if found; otherwise null
+ public IImageFormat FindFormatByMimeType(string mimeType)
+ {
+ return this.imageFormats.FirstOrDefault(x => x.MimeTypes.Contains(mimeType, StringComparer.OrdinalIgnoreCase));
+ }
+
+ ///
+ /// Sets a specific image encoder as the encoder for a specific image format.
+ ///
+ /// The image format to register the encoder for.
+ /// The encoder to use,
+ public void SetEncoder(IImageFormat imageFormat, IImageEncoder encoder)
+ {
+ Guard.NotNull(imageFormat, nameof(imageFormat));
+ Guard.NotNull(encoder, nameof(encoder));
+ this.AddImageFormat(imageFormat);
+ this.mimeTypeEncoders.AddOrUpdate(imageFormat, encoder, (s, e) => encoder);
+ }
+
+ ///
+ /// Sets a specific image decoder as the decoder for a specific image format.
+ ///
+ /// The image format to register the encoder for.
+ /// The decoder to use,
+ public void SetDecoder(IImageFormat imageFormat, IImageDecoder decoder)
+ {
+ Guard.NotNull(imageFormat, nameof(imageFormat));
+ Guard.NotNull(decoder, nameof(decoder));
+ this.AddImageFormat(imageFormat);
+ this.mimeTypeDecoders.AddOrUpdate(imageFormat, decoder, (s, e) => decoder);
+ }
+
+ ///
+ /// Removes all the registered image format detectors.
+ ///
+ public void ClearImageFormatDetectors()
+ {
+ this.imageFormatDetectors = new ConcurrentBag();
+ }
+
+ ///
+ /// Adds a new detector for detecting mime types.
+ ///
+ /// The detector to add
+ public void AddImageFormatDetector(IImageFormatDetector detector)
+ {
+ Guard.NotNull(detector, nameof(detector));
+ this.imageFormatDetectors.Add(detector);
+ this.SetMaxHeaderSize();
+ }
+
+ ///
+ /// For the specified mime type find the decoder.
+ ///
+ /// The format to discover
+ /// The if found otherwise null
+ public IImageDecoder FindDecoder(IImageFormat format)
+ {
+ Guard.NotNull(format, nameof(format));
+ if (this.mimeTypeDecoders.TryGetValue(format, out IImageDecoder decoder))
+ {
+ return decoder;
+ }
+
+ return null;
+ }
+
+ ///
+ /// For the specified mime type find the encoder.
+ ///
+ /// The format to discover
+ /// The if found otherwise null
+ public IImageEncoder FindEncoder(IImageFormat format)
+ {
+ Guard.NotNull(format, nameof(format));
+ if (this.mimeTypeEncoders.TryGetValue(format, out IImageEncoder encoder))
+ {
+ return encoder;
+ }
+
+ return null;
+ }
+
+ ///
+ /// Sets the max header size.
+ ///
+ private void SetMaxHeaderSize()
+ {
+ this.MaxHeaderSize = this.imageFormatDetectors.Max(x => x.HeaderSize);
+ }
+
+
+ }
+}