From 7f1fc960ed26d392f212d7b8ab43dd043fe37bac Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Thu, 26 Jan 2023 16:55:03 +1000 Subject: [PATCH] Use cache to make type threadsafe --- .../Conversion/ColorSpaceConverter.Adapt.cs | 2 +- .../Conversion/ColorSpaceConverter.CieXyz.cs | 18 +++++------------- .../Conversion/ColorSpaceConverter.cs | 3 +-- .../WorkingSpaces/RgbWorkingSpace.cs | 4 +--- 4 files changed, 8 insertions(+), 19 deletions(-) diff --git a/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.Adapt.cs b/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.Adapt.cs index c4ce0350a6..b4934e44ac 100644 --- a/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.Adapt.cs +++ b/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.Adapt.cs @@ -129,7 +129,7 @@ public partial class ColorSpaceConverter } // Conversion to XYZ - LinearRgbToCieXyzConverter converterToXYZ = this.GetLinearRgbToCieXyzConverter(color.WorkingSpace); + LinearRgbToCieXyzConverter converterToXYZ = GetLinearRgbToCieXyzConverter(color.WorkingSpace); CieXyz unadapted = converterToXYZ.Convert(color); // Adaptation diff --git a/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.CieXyz.cs b/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.CieXyz.cs index 65298597c3..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 52fa582356..b5e3162e64 100644 --- a/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.cs +++ b/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.cs @@ -1,7 +1,6 @@ // Copyright (c) Six Labors. // Licensed under the Six Labors Split License. -using System.Diagnostics.CodeAnalysis; using System.Numerics; namespace SixLabors.ImageSharp.ColorSpaces.Conversion; @@ -12,7 +11,7 @@ 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; 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); }