diff --git a/src/ImageSharp/Color/Color.cs b/src/ImageSharp/Color/Color.cs index 58bc77d14f..99a271bcf7 100644 --- a/src/ImageSharp/Color/Color.cs +++ b/src/ImageSharp/Color/Color.cs @@ -1,6 +1,5 @@ // Copyright (c) Six Labors. // Licensed under the Six Labors Split License. -#nullable disable using System.Numerics; using System.Runtime.CompilerServices; @@ -20,7 +19,7 @@ namespace SixLabors.ImageSharp; public readonly partial struct Color : IEquatable { private readonly Rgba64 data; - private readonly IPixel boxedHighPrecisionPixel; + private readonly IPixel? boxedHighPrecisionPixel; [MethodImpl(InliningOptions.ShortMethod)] private Color(byte r, byte g, byte b, byte a) @@ -317,7 +316,7 @@ public readonly partial struct Color : IEquatable } /// - public override bool Equals(object obj) => obj is Color other && this.Equals(other); + public override bool Equals(object? obj) => obj is Color other && this.Equals(other); /// [MethodImpl(InliningOptions.ShortMethod)] diff --git a/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.Adapt.cs b/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.Adapt.cs index 52a9ef27ee..b4934e44ac 100644 --- a/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.Adapt.cs +++ b/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.Adapt.cs @@ -32,7 +32,8 @@ public partial class ColorSpaceConverter return color; } - return this.chromaticAdaptation.Transform(color, sourceWhitePoint, targetWhitePoint); + // We know that chromaticAdaption is not null because performChromaticAdaption is checked + return this.chromaticAdaptation!.Transform(color, sourceWhitePoint, targetWhitePoint); } /// @@ -128,11 +129,12 @@ public partial class ColorSpaceConverter } // Conversion to XYZ - LinearRgbToCieXyzConverter converterToXYZ = this.GetLinearRgbToCieXyzConverter(color.WorkingSpace); + LinearRgbToCieXyzConverter converterToXYZ = GetLinearRgbToCieXyzConverter(color.WorkingSpace); CieXyz unadapted = converterToXYZ.Convert(color); // Adaptation - CieXyz adapted = this.chromaticAdaptation.Transform(unadapted, color.WorkingSpace.WhitePoint, this.targetRgbWorkingSpace.WhitePoint); + // We know that chromaticAdaption is not null because performChromaticAdaption is checked + CieXyz adapted = this.chromaticAdaptation!.Transform(unadapted, color.WorkingSpace.WhitePoint, this.targetRgbWorkingSpace.WhitePoint); // Conversion back to RGB return this.cieXyzToLinearRgbConverter.Convert(adapted); diff --git a/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.CieXyz.cs b/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.CieXyz.cs index ac1fa8ed0a..1244655227 100644 --- a/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.CieXyz.cs +++ b/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.CieXyz.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors. // Licensed under the Six Labors Split License. +using System.Collections.Concurrent; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -11,9 +12,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion; /// public partial class ColorSpaceConverter { - private static readonly HunterLabToCieXyzConverter HunterLabToCieXyzConverter = new(); - - private LinearRgbToCieXyzConverter linearRgbToCieXyzConverter; + private static readonly ConcurrentDictionary ConverterCache = new(); /// /// Converts a into a . @@ -327,7 +326,7 @@ public partial class ColorSpaceConverter public CieXyz ToCieXyz(in LinearRgb color) { // Conversion - LinearRgbToCieXyzConverter converter = this.GetLinearRgbToCieXyzConverter(color.WorkingSpace); + LinearRgbToCieXyzConverter converter = GetLinearRgbToCieXyzConverter(color.WorkingSpace); CieXyz unadapted = converter.Convert(color); return this.Adapt(unadapted, color.WorkingSpace.WhitePoint); @@ -454,13 +453,6 @@ public partial class ColorSpaceConverter /// /// The source working space /// The - private LinearRgbToCieXyzConverter GetLinearRgbToCieXyzConverter(RgbWorkingSpace workingSpace) - { - if (this.linearRgbToCieXyzConverter?.SourceWorkingSpace.Equals(workingSpace) == true) - { - return this.linearRgbToCieXyzConverter; - } - - return this.linearRgbToCieXyzConverter = new LinearRgbToCieXyzConverter(workingSpace); - } + private static LinearRgbToCieXyzConverter GetLinearRgbToCieXyzConverter(RgbWorkingSpace workingSpace) + => ConverterCache.GetOrAdd(workingSpace, (key) => new LinearRgbToCieXyzConverter(key)); } diff --git a/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.cs b/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.cs index d7fa5f539a..b5e3162e64 100644 --- a/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.cs +++ b/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.cs @@ -1,6 +1,5 @@ // Copyright (c) Six Labors. // Licensed under the Six Labors Split License. -#nullable disable using System.Numerics; @@ -12,14 +11,14 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion; public partial class ColorSpaceConverter { // Options. - private static readonly ColorSpaceConverterOptions DefaultOptions = new ColorSpaceConverterOptions(); + private static readonly ColorSpaceConverterOptions DefaultOptions = new(); private readonly Matrix4x4 lmsAdaptationMatrix; private readonly CieXyz whitePoint; private readonly CieXyz targetLuvWhitePoint; private readonly CieXyz targetLabWhitePoint; private readonly CieXyz targetHunterLabWhitePoint; private readonly RgbWorkingSpace targetRgbWorkingSpace; - private readonly IChromaticAdaptation chromaticAdaptation; + private readonly IChromaticAdaptation? chromaticAdaptation; private readonly bool performChromaticAdaptation; private readonly CieXyzAndLmsConverter cieXyzAndLmsConverter; private readonly CieXyzToCieLabConverter cieXyzToCieLabConverter; diff --git a/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverterOptions.cs b/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverterOptions.cs index 4fb5210670..9f576de726 100644 --- a/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverterOptions.cs +++ b/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverterOptions.cs @@ -44,7 +44,7 @@ public class ColorSpaceConverterOptions /// /// Gets or sets the chromatic adaptation method used. When null, no adaptation will be performed. /// - public IChromaticAdaptation ChromaticAdaptation { get; set; } = new VonKriesChromaticAdaptation(); + public IChromaticAdaptation? ChromaticAdaptation { get; set; } = new VonKriesChromaticAdaptation(); /// /// Gets or sets transformation matrix used in conversion to and from . diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/RgbWorkingSpace.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/RgbWorkingSpace.cs index f22f2ff1fa..dd1dc62a86 100644 --- a/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/RgbWorkingSpace.cs +++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/RgbWorkingSpace.cs @@ -75,7 +75,5 @@ public abstract class RgbWorkingSpace /// public override int GetHashCode() - { - return HashCode.Combine(this.WhitePoint, this.ChromaticityCoordinates); - } + => HashCode.Combine(this.WhitePoint, this.ChromaticityCoordinates); }